gpt4 book ai didi

silverlight - 如何绑定(bind) DataGridColumn.Visibility?

转载 作者:行者123 更新时间:2023-12-03 20:22:21 24 4
gpt4 key购买 nike

我有一个类似于以下帖子的问题:

Silverlight DataGridTextColumn Binding Visibility

我需要根据 ViewModel 中的值使 Silverlight DataGrid 中的列可见/折叠。为此,我尝试将 Visibility 属性绑定(bind)到 ViewModel。但是我很快发现 Visibility 属性不是 DependencyProperty,因此它不能被绑定(bind)。

为了解决这个问题,我尝试子类化我自己的 DataGridTextColumn。通过这个新类,我创建了一个 DependencyProperty,它最终将更改推送到 DataGridTextColumn.Visibility 属性。如果我不进行数据绑定(bind),这很好用。当我将数据绑定(bind)到我的新属性时,它会失败,并出现 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} 语法替换为“Collapsed”,则 Column 实际上会消失。
  • 如果我创建一个新的 DependencyProperty(即字符串 Foo)并绑定(bind)到它,我也会收到 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 类基于 添加新的 DP 用于隐藏列x:姓名 数据网格列 及其后代。

    要在 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 - 如何绑定(bind) DataGridColumn.Visibility?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045014/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com