大佬教程收集整理的这篇文章主要介绍了silverlight – 如何绑定DataGridColumn.Visibility?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,请注明来意。