【问题标题】:Use a ValueConverter in prsim model在 prsim 模型中使用 ValueConverter
【发布时间】:2015-11-26 23:48:25
【问题描述】:

我有一个值转换器,当它的文本是否以 http 开头时,它可以转换控件的可见性方面。下面是代码。

public class HTTPVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool boolVisbility = (value != null) && value.ToString().StartsWith("http");

        boolVisbility = (parameter != null) ? !boolVisbility : boolVisbility;

        return boolVisbility ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我已将此代码放在 ToolViewe.xaml.cs 中。 我正在尝试在我的数据网格中使用上述转换器,如下所示:

<slData:DataGrid x:Name="CustomerDetailsDataGrid"   
 ItemsSource=" {Binding     SingleReturnedItemAttributes}"  
 AutoGenerateColumns="False"HeadersVisibility="None"   
 ScrollViewer.HorizontalScrollBarVisibility="Visible"  
 ScrollViewer.VerticalScrollBarVisibility="Visible" MaxHeight="350"   
 MaxWidth="350">

<slData:DataGrid.Columns>
<slData:DataGridTextColumn    Binding="  {Binding Path=Key}" 
 FontWeight="Bold"/>
 <slData:DataGridTextColumn Binding="{Binding Path= Value}" Visibility="
 {Binding Path=IsControlVisible,Converter={StaticResource theHttpVisbilityConverter}}" 
 />
<slData:DataGridTextColumn Binding="{Binding Path= Value}" Visibility="
 {Binding Path=IsControlVisible ,Converter={StaticResource theHttpVisbilityConverter}, 
  ConverterParameter=reverse}" 
 />
 </slData:DataGrid.Columns>

我应该为可见性的绑定路径使用什么?我尝试通过在 ToolViewModel.cs 中声明代码来使用以下属性。但不起作用。请指导这个新手。

bool isControlVisible = false;
    public bool IsControlVisible
    {
        get { return isControlVisible; }
        set
        {
            isControlVisible = value;
            this.RaisePropertyChanged(() => this.IsControlVisible);
        }
    }

这是错误:“System.Windows.Data.Binding”类型的对象无法转换为“System.Windows.Visibility”类型。

【问题讨论】:

  • 不太清楚你要做什么,如果你想隐藏整个列,那么你需要使用binding proxy。如果要隐藏单个单元格,则需要 set the element style 代替。两种情况都是重复的。
  • 嗨,马克,你说的是真的。将有两列,一行的一个单元格将有一个 url 。我只需要将 url 作为链接,或者如果文本不包含 : http 那么它将显示为纯文本。看起来像这样

标签: c# silverlight mvvm prism


【解决方案1】:

我终于能够找出错误背后的原因:

我已经为 xaml.cs 中的 datagridtextcolumn 和 datagridtemplatecolumn 的可见性创建了依赖项。

public class VisibilityData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _visible = true;

    public bool Visible
    {
        get { return this._visible; }
        set
        {
            if (this._visible != value)
            {
                this._visible = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs("Visible"));
                }
            }
        }
    }
}


public class ExtendedDataGridTextColumn : DataGridTextColumn
{
    public Visibility MyVisibility
    {
        get
        {
            return (Visibility)GetValue(MyVisibilityProperty);
        }
        set
        {
            SetValue(MyVisibilityProperty, value);
        }
    }

    public static readonly DependencyProperty MyVisibilityProperty = DependencyProperty.Register("MyVisibility", typeof(Visibility), typeof(ExtendedDataGridTextColumn), new PropertyMetadata(MyVisibilityChanged));

    private static void MyVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var n = d as ExtendedDataGridTextColumn;
        if (n != null && e.NewValue is Visibility)
        {
            n.Visibility = (Visibility)e.NewValue;
        }
    }

    public ExtendedDataGridTextColumn()
    {
    }

}

public class CustomDataGridTemplateColumn : DataGridTemplateColumn
{
    public static readonly DependencyProperty VisibilityBindingProperty = DependencyProperty.Register(
      "VisibilityBinding", typeof(Visibility), typeof(CustomDataGridTemplateColumn), new PropertyMetadata(Visibility.Collapsed, new PropertyChangedCallback(OnVisibilityChanged)));

    public Visibility VisibilityBinding
    {
        get { return (Visibility)this.GetValue(VisibilityBindingProperty); }
        set { this.SetValue(VisibilityBindingProperty, value); }
    }

    private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((CustomDataGridTemplateColumn)d).Visibility = (Visibility)e.NewValue;
    }

}

现在这就是我的数据网格的样子:

<slData:DataGrid x:Name="Customer" ItemsSource="{Binding ReturnedItemAttributes}" AutoGenerateColumns="False"  HeadersVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" MaxHeight="350" MaxWidth="350">

                        <slData:DataGrid.Resources>
                            <ResourceDictionary>
                                <local:HTTPVisibilityConverter x:Key="httpVisibility"/>
                                <local:VisibilityData x:Key="visibilityValue"/>
                            </ResourceDictionary>
                        </slData:DataGrid.Resources>
                        <slData:DataGrid.Columns>
                            <local:ExtendedDataGridTextColumn Binding="{Binding Path=Key}" FontWeight="Bold"/>                                
                            <local:ExtendedDataGridTextColumn Binding="{Binding Path=Value}" MyVisibility="{Binding Visible, Source={StaticResource visibilityValue}, Converter={StaticResource httpVisibility}, ConverterParameter=Reverse}"/>

                            <local:CustomDataGridTemplateColumn Width="40"  VisibilityBinding="{Binding Visible, Source={StaticResource visibilityValue}, Converter={StaticResource httpVisibility}}">
                                <local:CustomDataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                        <HyperlinkButton Content="Pdf Link" Height="23" Name="PdfUrl" Width="76" NavigateUri="{Binding Path=Value, Mode=TwoWay}"    TargetName="_blank" Margin="5,10,10,7" Foreground="Blue" />
                                    </DataTemplate>
                                </local:CustomDataGridTemplateColumn.CellTemplate>
                            </local:CustomDataGridTemplateColumn>

                        </slData:DataGrid.Columns>
                    </slData:DataGrid>

这就是我解决之前错误的方法。

所以现在我可以在单独的列中看到 pdf 超链接,但我的 datatagridtemplate 列的转换器似乎不起作用。但它适用于 datagridtextcolumn。有人可以指定如何使用我的转换器隐藏 datagridtemplatecoulumn。现在我的网格也显示为这个

 Column1  column2  Column3
    name    John     pdf
    CustomerID   1234   pdf
    Customer_url  hhtp://www.test.com  pdf

我怎样才能从其他行中删除 pdf 链接并仅保留客户 url 行。谢谢你

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2013-08-12
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多