我有以下WPF示例程序:
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>
代码隐藏:
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; }
}
如您所见,如果Flag
属性设置为false,我希望隐藏第二个datagrid列。但它不起作用。我在Visual Studio输出窗口中看到以下绑定错误:
System.Windows.Data错误:4:无法找到具有引用'RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel=‘1’的绑定源。可见性;可见性;目标元素为'DataGridTextColumn‘(HashCode=44856655);目标属性为'Visibility’(类型为'Visibility')
我的代码中关于Visibility
属性的错误是什么?
发布于 2011-07-28 20:24:05
数据网格中的列是一个抽象对象,它不会出现在可视化树中,因此您不能使用RelativeSource
-binding,ElementName
也不会工作,因为它找不到管理FrameworkContentElement,所以您处于某种绑定中。
一种工作方式是通过Source
和x:Reference
,因此您需要命名窗口并将列移动到其资源,以避免循环依赖错误:
<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"/>
<!-- ... -->
非常有趣。
发布于 2016-11-07 13:39:42
我更喜欢一种更优雅的方法,包括使用Freezable
。
<Window.Resources>
<DiscreteObjectKeyFrame x:Key="FlagKey" Value="{Binding Flag}"/>
</Window.Resources>
<DataGridTextColumn ... Visibility="{Binding Value, Source={StaticResource FlagKey}, ...}" />
发布于 2011-07-28 19:24:41
DataGridTextColumn上的可见性不是DependencyProperty,不能绑定到数据。使用DataGridTemplateColumn并绑定模板内控件的可见性。
编辑:实际上,这句话只适用于silverlight。有关详细信息,请参阅另一个SO问题。
How to bind DataGridColumn.Visibility?
我在这里询问了判断属性是否是依赖项的最简单方法。
How can I most easily determine whether a property is a dependency property?
https://stackoverflow.com/questions/6857780
复制相似问题