silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了silverlight – 如何绑定DataGridColumn.Visibility?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个类似于以下帖子的问题: Silverlight DataGridTextcolumn Binding Visibility 我需要一个Silverlight DataGrid中的列可以基于ViewModel中的值来显示/折叠.要完成这个,我试图将Visibility属性绑定到ViewModel.但是我很快发现Visibility属性不是DependencyProperty,因此它不能绑定.
我有一个类似于以下帖子的问题:

Silverlight DataGridTextColumn Binding Visibility

我需要一个Silverlight DataGrid中的列可以基于viewmodel中的值来显示/折叠.要完成这个,我试图将Visibility属性绑定到viewmodel.但是我很快发现Visibility属性不是DependencyProperty,因此它不能绑定.

为了解决这个问题,我试图将自己的DataGridTextcolumn子类化.有了这个新类,我创建了一个DependencyProperty,它最终将更改推送到DataGridTextcolumn.Visibility属性.这样做很好,如果我不数据绑定.当我将数据绑定到我的新属性时,它会失败,并出现AG_E_PARSER_BAD_PROPERTY_VALUE异常.

public class MyDataGridTextcolumn : DataGridTextcolumn
{
    #region public Visibility MyVisibility

    public static readonly DependencyProperty MyVisibilityProperty =
        DependencyProperty.Register("MyVisibility",typeof(Visibility),typeof(MyDataGridTextcolumn),new PropertyMetadata(Visibility.Visible,OnMyVisibilityPropertyChanged));

    private static void OnMyVisibilityPropertyChanged(DependencyObject d,DependencyPropertyChangedEventArgs E)
    {
        var @this = d as MyDataGridTextcolumn;

        if (@this != null)
        {
            @this.OnMyVisibilityChanged((Visibility)e.oldValue,(Visibility)e.Newvalue);
        }
    }

    private void OnMyVisibilityChanged(Visibility oldValue,Visibility newvalue)
    {
        Visibility = newValue;
    }

    public Visibility MyVisibility
    {
        get { return (Visibility)GetValue(MyVisibilityProperty); }
        set { SETVALue(MyVisibilityProperty,value); }
    }

    #endregion public Visibility MyVisibility
}

这是XAML的一小部分.

<DataGrid ....>
    <DataGrid.columns>
        <MyDataGridTextcolumn Header="User Name"
                              Foreground="#FFFFFFFF"
                              Binding="{Binding User.UserNamE}"
                              MinWidth="150"
                              CanUserSort="True"
                              CanUserResize="false"
                              CanUserReorder="True"
                              MyVisibility="{Binding Converter={Staticresource BoolToVisibilityConverter},Path=ShouldShowUser}"/>
        <DataGridTextcolumn .../>
    </DataGrid.columns>
</DataGrid>

几个重要的事实.

>转换器的确定在上面的本地资源中.
>转换器是正确的,它在解决方案中使用了许多其他地方.
>如果我用“折叠”替换MyVisibility属性{Binding}语法,那么列实际上消失了.
>如果我创建一个新的DependencyProperty(即字符串Foo),并绑定到它,我也收到AG_E_PARSER_BAD_PROPERTY_VALUE异常.

有人有什么想法为什么这不工作?

解决方法

这是解决方案,我想到了一个小黑客.

首先,您需要继承DataGrid.

public class DataGridEx : DataGrid
{
    public IEnumerable<String> Hiddencolumns
    {
        get { return (IEnumerable<String>)GetValue(HiddencolumnsProperty); }
        set { SETVALue(HiddencolumnsProperty,value); }
    }

    public static readonly DependencyProperty HiddencolumnsProperty =
        DependencyProperty.Register ("Hiddencolumns",typeof (IEnumerable<String>),typeof (DataGridEX),new PropertyMetadata (HiddencolumnsChanged));

    private static void HiddencolumnsChanged(object sender,DependencyPropertyChangedEventArgs args)
    {
        var dg = sender as DataGrid;
        if (dg==null || args.NewValue == args.Oldvalue)
            return;

        var hiddencolumns = (IEnumerable<String>)args.NewValue;
        foreach (var column in dg.columns)
        {
            if (hiddencolumns.Contains ((String)column.GetValue (NameProperty)))
                column.Visibility = Visibility.Collapsed;
            else
                column.Visibility = Visibility.Visible;
        }
    }
}

DataGridEx类根据DataGridcolumn及其后代的x:Name名称添加新的DP来隐藏列.

在您的XAML中使用:

<my:DataGridEx x:Name="uiData"
               DataContext="{Binding SomeDataContextFromTheVM}"
               Itemssource="{Binding whatever}"
               Hiddencolumns="{Binding Hiddencolumns}">
    <sdk:DataGridTextcolumn x:Name="uiDataCountOfItems">
                            Header="Count"
                            Binding={Binding CountOfItems}"
    </sdk:DataGridTextcolumn>
</my:DataGridEx>

您需要将这些添加到您的viewmodel或您使用的任何数据上下文.

private IEnumerable<String> _hiddencolumns;
public IEnumerable<String> Hiddencolumns
{
    get { return _hiddencolumns; }
    private set
    {
        if (value == _hiddencolumns)
            return;

        _hiddencolumns = value;
        PropertyChanged (this,new PropertyChangedEventArgs("Hiddencolumns"));
    }
}

public void SomeWhereInYourCode ()
{
    Hiddencolumns = new List<String> {"uiDataCountOfItems"};
}

要取消隐藏,您只需要从列表中删除相应的名称或重新创建它,而不使用未隐藏的名称.

大佬总结

以上是大佬教程为你收集整理的silverlight – 如何绑定DataGridColumn.Visibility?全部内容,希望文章能够帮你解决silverlight – 如何绑定DataGridColumn.Visibility?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。