如何隐藏取决于物业WPF DataGrid列 [英] How to hide wpf datagrid columns depending on a property
问题描述
我有以下的WPF示例程序:
I have the following WPF sample program:
XAML中:
<Window x:Class="AncestorArie.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
<Grid>
<DataGrid AutoGenerateColumns="False" Name="Blumen"
ItemsSource="{Binding Leaves}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Color}"
Header="Farbe" Width="160" />
<DataGridTextColumn Binding="{Binding Size}"
Header="Größe" Width="60"
Visibility="{Binding Path=DataContext.Flag,
RelativeSource={RelativeSource Findancestor,
AncestorType={x:Type Window}},
Converter={StaticResource BoolToVis}}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
背后code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Flowers rose = new Flowers();
rose.Leaves = new ObservableCollection<Leaf>();
rose.Flag = false;
Leaf L1 = new Leaf();
L1.Color = "rot";
L1.Size = 3;
rose.Leaves.Add(L1);
Leaf L2 = new Leaf();
L2.Color = "gelb";
L2.Size = 2;
rose.Leaves.Add(L2);
this.DataContext = rose;
}
}
和模型类是:
public class Leaf
{
public string Color { get; set; }
public int Size { get; set; }
}
public class Flowers
{
public bool Flag { get; set; }
public ObservableCollection<Leaf> Leaves { get; set; }
}
正如你所看到的,我要隐藏的第二个DataGrid列,如果标志
属性设置为false。但是,这是行不通的。我得到以下绑定错误在Visual Studio Output窗口:
As you can see, I want to hide the 2nd datagrid column, if the Flag
property is set to false. But it doesn't work. I get the following binding error in the Visual Studio Output window:
System.Windows.Data错误:4:无法与绑定找到源
参考的RelativeSource FindAncestor,
AncestorType ='System.Windows.Window',AncestorLevel ='1''。
BindingEx pression:路径= DataContext.Flag;的DataItem = NULL;目标元素
是DataGridTextColumn(哈希code = 44856655); target属性
'能见度'(类型'能见度')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=DataContext.Flag; DataItem=null; target element is 'DataGridTextColumn' (HashCode=44856655); target property is 'Visibility' (type 'Visibility')
这有什么不对有关可见我的code
属性?
What is wrong in my code concerning the Visibility
attribute?
推荐答案
在DataGrid中的一列是不显示在可视化树的抽象对象,所以你不能用的RelativeSource
结合位,的ElementName
将无法工作要么因为它不会找到一个管理FrameworkContentElement上,所以你是实物绑定的。
A column in a datagrid is an abstract object which does not appear in the visual tree, thus you cannot use RelativeSource
-binding, ElementName
will not work either since it will not find a governing FrameworkContentElement so you are in kind of a bind.
这是工作的一种方式是通过来源
和 X:参考
,为您将需要命名窗口和列移动到它的资源,以避免周期性的依赖错误:
One way that works is via Source
and x:Reference
, for that you will need to name your window and move the column to its resources to avoid a cyclical dependency error:
<Window Name="_window" ...>
<Window.Resources>
<DataGridTextColumn x:Key="ThatPeskyColumn"
Binding="{Binding Size}"
Visibility="{Binding DataContext.Flag, Source={x:Reference _window}, Converter={StaticResource BoolToVis}}"/>
</Window.Resources>
<!-- ... -->
<DataGrid AutoGenerateColumns="False" Name="Blumen"
ItemsSource="{Binding Leaves}">
<DataGrid.Columns>
<StaticResource ResourceKey="ThatPeskyColumn"/>
<!-- ... -->
大乐趣。
这篇关于如何隐藏取决于物业WPF DataGrid列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!