如何通过绑定隐藏 WPF 数据网格
中的列?
这就是我所做的:
<DataGridTextColumn Header="Column header"
Binding="{Binding ColumnValue}"
Width="100"
ElementStyle="{StaticResource DataGridRightAlign}"
Visibility="{Binding MyColumnVisibility}" />
这是我得到的(除了仍然可见的列):
System. Windows. Data错误:2:找不到目标元素的管理Frameworks Element或Frameworks ContentElement。绑定表达式:路径=My列可见性;数据项=空;目标元素是“DataG的文本列”(HashCode=1460142);目标属性是“可见性”(类型“可见性”)
如何修复绑定?
我喜欢的另一个简单的解决方案是在与DataGrid
相同的级别添加一个虚拟的折叠FrameworkElement
。然后,FrameworkElement
可以用作绑定
的
标记扩展。
比如像这样:
<FrameworkElement x:Name="FrameWorkElementProxy" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.DataGridColumnVisibility, Source={x:Reference Name=FrameWorkElementProxy}}"/>
</DataGrid.Columns>
</DataGrid>
<Window.Resources>
<ResourceDictionary>
<FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
</ResourceDictionary>
</Window.Resources>
<!-- Necessary for binding to resolve: adds reference to ProxyElement to tree.-->
<ContentControl Content="{StaticResource ProxyElement}" Visibility="Collapsed" />
<mch:MCHDataGrid Height="350"
AutoGenerateColumns="False"
FlowDirection="LeftToRight"
ItemsSource="{Binding PayStructures}"
SelectedItem="{Binding SelectedItem}">
<DataGrid.Columns>
<DataGridTemplateColumn Width="70"
Header="name"
IsReadOnly="True"
Visibility="{Binding DataContext.IsShowName,
Source={StaticResource ProxyElement}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding FieldName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</mch:MCHDataGrid>
视图模型中绑定属性的示例:
private Visibility _isShowName;
public Visibility IsShowName
{
get { return _isShowName; }
set
{
_isShowName = value;
OnPropertyChanged();
}
}
首先,DataG里德特列
(或任何其他受支持的dataGrid列)不位于DataGrid
的Visual树中。因此,默认情况下,它不会继承DataGrid
的DataContext
。但是,它仅适用于绑定
DP,不适用于DataG里德列上的其他DP。
由于它们不位于同一个VisualTree中,因此任何使用RelativeSource
获取DataContext
的尝试都不会奏效,因为DataG的文本列
无法遍历到数据网格
。
不过,还有另外两种方法可以实现这一点:
可冻结
对象可以继承 DataContext,即使它们不在可视化或逻辑树中 - 我们可以利用这一点。
首先,创建一个继承自Freezable
和Data
DP的类,我们可以使用它在XAML中绑定:
public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy));
}
现在,在DataGrid资源中添加一个它的实例,以便它可以继承DataGrid的DataContext并可以与其Data DP绑定:
<DataGrid>
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Data.MyColumnVisibility,
Source={StaticResource proxy}}"/>
</DataGrid.Columns>
</DataGrid>
其次,您可以使用ElementName
或x:Reference
引用XAML中的任何UI元素。然而,<code>ElementName</code>只在同一个可视树中工作,而x:Reference没有这样的约束。
因此,我们也可以利用这一优势。在XAML中创建一个虚拟的<code>FrameworkElement</code>,可见性设置为<code>折叠</code>。FrameworkElement将从其父容器(可以是Window或UserControl)继承DataContext。
并且可以在DataGrid中使用:
<FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Test"
Binding="{Binding Name}"
Visibility="{Binding DataContext.IsEnable,
Source={x:Reference dummyElement}}"/>
</DataGrid.Columns>
</DataGrid>
我在这里遇到了TreeView绑定和ContextMenu的问题:Selected TreeView项为空 现在我有这个问题:我有ContextMenu (图片显示了我的ContextMenu的样子,不要介意tabItem...)。 正如你所看到的,它只是ContetMenu,没有MenuItem!如果用户单击“关闭”,我想在ViewModel中执行一些操作(发出命令?)。我还想知道他点了哪个按钮
这是我的上下文菜单的样式: 这是我的MenuItem的样式: 命令绑定工作正常,但图标可见性绑定显示以下错误: 系统.Windows。数据错误:4:无法找到引用“RelativeSource FindAncestor,AncestorType=”System.Windows.Controls的绑定源。上下文菜单',祖先级别=“1”。BindingExpression:路径=PlacementTar
GridViewColumnExt是从GridViewColumn继承并添加可见性属性的类。 您可能会看到,我的ListView的ItemsSource被设置为寄存器ObservableCollection。Register类有一个名为vis的bool类型的属性。对于TextBox来说,这一切都很好,但是从GridViewColumnExt don来看,我认为我无法到达集合并绑定到特定的对象。 我
我找不到访问“PR1”的方法,因为它在DataTemplate中,因此不能直接从代码隐藏中访问。绑定不能通过吗?它之前的列(“P2”列)就在test列上,我放入该列只是为了确保该值确实在更新,并且正确显示,但是“ProgressColumn”总是只显示默认值。 在ListView.View>GridView>GridViewColumn>GridViewColumn.CellTemplate>Da
最好的办法是什么?根据显示的数据,我希望绑定到MyText1或MyText2。我怎么做“开关”?