依赖于 UserControl 和嵌套的 DataGrid 属性
Dependency Property on UserControl and nested DataGrid
我有一个这样的用户控件:
<UserControl>
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<DataGrid ItemSource="{Binding Contacts}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
<DataGridTextColumn Binding="{Binding Address}"
Visibility="{Binding Path=ShowAddress,
Converter={StaticResource BoolToVisible}}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</UserControl>
显示地址声明:
public bool ShowAddress
{
get { return (bool)GetValue(ShowAddressProperty); }
set { SetValue(ShowAddressProperty, value); }
}
public static readonly DependencyProperty ShowAddressProperty =
DependencyProperty.Register("ShowAddress", typeof(bool), typeof(Contacts), new PropertyMetadata(true));
DataContext 为 null,我将 ListView ItemsSource 设置为 Persons 的 IEnumerable
public class Persons
{
public int ID { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public List<Persons> Contacts { get; set; }
}
我需要 UserControl 的依赖项 属性 在列表视图中隐藏或显示数据网格的某些列。这样我就可以直接从包含用户控件的 window 控制显示哪些列。这可能吗?
我尝试使用以下代码,但在输出控制台上出现错误:
{Binding Path=ShowAddress, Converter={StaticResource BoolToVisible}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}
System.Windows.Data Error: 4 : Cannot find source for binding with
reference 'RelativeSource FindAncestor,
AncestorType='System.Windows.Controls.UserControl',
AncestorLevel='1''. BindingExpression:Path=ShowAddress; DataItem=null;
target element is 'DataGridTextColumn' (HashCode=55248170); target
property is 'Visibility' (type 'Visibility')
也许可以使用资源用户控件来完成,但数据网格对用户控件中定义的资源没有作用域。
注意:BoolToVisible 是一个转换器,可以将"true" 转换为"Visible",将"false" 转换为"Collapsed"。
RelativeSource 扩展不适用于 DataGridTextColumn(或任何其他 DataGridColumn),因为该列不是逻辑树的一部分。您可以执行一些解决方法,例如:
<UserControl x:Class="Test31990722.Contacts"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Test31990722"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Name="uc">
<UserControl.Resources>
<local:BoolToVisible x:Key="BoolToVisible" />
</UserControl.Resources>
<ListView Name="lv">
<ListView.ItemTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Contacts}" AutoGenerateColumns="False"
Tag="{Binding ShowAddress, ElementName=uc,Converter={StaticResource BoolToVisible}}">
<DataGrid.Resources>
<TextBlock x:Key="FileNameColHeader" Text="Address" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}, Path=Tag}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
<DataGridTextColumn Binding="{Binding Address}" Header="{StaticResource FileNameColHeader}"
Visibility="{Binding Tag, Source={StaticResource FileNameColHeader}}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</UserControl>
希望,有帮助
我有一个这样的用户控件:
<UserControl>
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<DataGrid ItemSource="{Binding Contacts}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
<DataGridTextColumn Binding="{Binding Address}"
Visibility="{Binding Path=ShowAddress,
Converter={StaticResource BoolToVisible}}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</UserControl>
显示地址声明:
public bool ShowAddress
{
get { return (bool)GetValue(ShowAddressProperty); }
set { SetValue(ShowAddressProperty, value); }
}
public static readonly DependencyProperty ShowAddressProperty =
DependencyProperty.Register("ShowAddress", typeof(bool), typeof(Contacts), new PropertyMetadata(true));
DataContext 为 null,我将 ListView ItemsSource 设置为 Persons 的 IEnumerable
public class Persons
{
public int ID { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public List<Persons> Contacts { get; set; }
}
我需要 UserControl 的依赖项 属性 在列表视图中隐藏或显示数据网格的某些列。这样我就可以直接从包含用户控件的 window 控制显示哪些列。这可能吗?
我尝试使用以下代码,但在输出控制台上出现错误:
{Binding Path=ShowAddress, Converter={StaticResource BoolToVisible}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=ShowAddress; DataItem=null; target element is 'DataGridTextColumn' (HashCode=55248170); target property is 'Visibility' (type 'Visibility')
也许可以使用资源用户控件来完成,但数据网格对用户控件中定义的资源没有作用域。
注意:BoolToVisible 是一个转换器,可以将"true" 转换为"Visible",将"false" 转换为"Collapsed"。
RelativeSource 扩展不适用于 DataGridTextColumn(或任何其他 DataGridColumn),因为该列不是逻辑树的一部分。您可以执行一些解决方法,例如:
<UserControl x:Class="Test31990722.Contacts"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Test31990722"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Name="uc">
<UserControl.Resources>
<local:BoolToVisible x:Key="BoolToVisible" />
</UserControl.Resources>
<ListView Name="lv">
<ListView.ItemTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Contacts}" AutoGenerateColumns="False"
Tag="{Binding ShowAddress, ElementName=uc,Converter={StaticResource BoolToVisible}}">
<DataGrid.Resources>
<TextBlock x:Key="FileNameColHeader" Text="Address" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}, Path=Tag}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"/>
<DataGridTextColumn Binding="{Binding Address}" Header="{StaticResource FileNameColHeader}"
Visibility="{Binding Tag, Source={StaticResource FileNameColHeader}}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</UserControl>
希望,有帮助