隐藏Datagrid中的用户控件
本文关键字:用户 控件 Datagrid 隐藏 | 更新日期: 2023-09-27 18:10:51
我有一个用户控件,我包括在我的datagrid列。但是我想在一定条件的基础上隐藏这个用户控制。我尝试绑定该用户控件的可见性,但这不起作用。我不知道为什么会这样。
<DataGrid>
... .
...
<UserControl:MyUserControl Visibility="{Binding
SomeProperty,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</DataGrid>
但是如果我使用相同的属性来隐藏DataGrid列中存在的其他控件。他们在一定的条件下工作和躲藏。
我不知道发生了什么事。尝试显式设置UserControl的DataContext属性:
<UserControl:MyUserControl DataContext="{Binding}" Visibility="{Binding
SomeProperty,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
我很确定在输出或即时窗口中有一个绑定错误。
为什么?
因为您的控件正在查找集合实体中不存在的SomeProperty
。
您建议的属性在Page ViewModel级别可用。
<UserControl:MyUserControl
Visibility="{Binding DataContext.IsVisible,
RelativeSource={RelativeSource FindAncestor,
AncestorType=YourUserControl}" />
由于控件嵌套在DataGrid中,因此数据绑定的DataContext与DataGrid上下文相同。
因此,您可以选择将元素的可见性绑定到DataGrid DataContext的属性,或者将其绑定到相对UI父DataContext或prox的属性。
我将以下列模型为例。
public class ViewModel
{
public class Foo
{
public int Id {get;set;}
public Visibility IsVisible {get;set;}
}
private IList<Foo> _fooList;
public IList<Foo> FooList {get;set;}
private Visibility _parentVisibility;
public Visibility ParentVisibility{get;set}
}
方案1 (DataGrid datacontext):
假设你的数据网格绑定到FooList
,你可以直接绑定到Foo
对象的IsVisible
属性:
<UserControl:MyUserControl Visibility="{Binding IsVisible}" />
方案2(父上下文):
如果你想将UserControl的可见性绑定到一个不在datagrid上下文中的属性,你必须指定一个RelativeSource
或DataContextProxy
来绑定。
对于RelativeSource
的解决方案,你可以将UserControl的可见性绑定到ParentVisibility
属性:
<UserControl:MyUserControl Visibility="{Binding DataContext.ParentVisibility, RelativeSource={RelativeSource FindAncestor, AncestorType=YourPageUserControl}" />