隐藏Datagrid中的用户控件

本文关键字:用户 控件 Datagrid 隐藏 | 更新日期: 2023-09-27 18:10:51

我有一个用户控件,我包括在我的datagrid列。但是我想在一定条件的基础上隐藏这个用户控制。我尝试绑定该用户控件的可见性,但这不起作用。我不知道为什么会这样。

<DataGrid>
... .
... 
  <UserControl:MyUserControl Visibility="{Binding 
SomeProperty,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</DataGrid>

但是如果我使用相同的属性来隐藏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上下文中的属性,你必须指定一个RelativeSourceDataContextProxy来绑定。

对于RelativeSource的解决方案,你可以将UserControl的可见性绑定到ParentVisibility属性:

<UserControl:MyUserControl Visibility="{Binding DataContext.ParentVisibility, RelativeSource={RelativeSource FindAncestor, AncestorType=YourPageUserControl}" />