隐藏Datagrid中存在的用户控件

时间:2014-07-01 07:13:39

标签: c# wpf user-controls wpfdatagrid visibility

我有一个usercontrol,我将其包含在我的datagrid列中。 但我想在某些条件的基础上隐藏该用户控件。 我尝试绑定该用户控件的可见性,但这不起作用。我不知道为什么会发生这种情况。

<DataGrid>
... .
... 

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

但是如果我在隐藏DataGrid列中存在的其他控件时使用相同的属性。它们正在工作并且在特定条件下隐藏。

我不知道发生了什么。请帮助我们。

3 个答案:

答案 0 :(得分:0)

尝试显式设置UserControl的DataContext属性:

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

否则显示dataGrid的完整xaml。

答案 1 :(得分:0)

由于您的控件嵌套在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):

假设您的datagrid绑定到FooList,您可以直接绑定到IsVisible对象的Foo属性:

<UserControl:MyUserControl Visibility="{Binding IsVisible}" />

解决方案2(家长背景):

如果要将UserControl的可见性绑定到不在datagrid上下文中的属性,则必须为绑定指定RelativeSourceDataContextProxy

转到RelativeSource解决方案,您可以将UserControl的可见性绑定到ParentVisibility属性,如下所示:

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

希望这有帮助。

答案 2 :(得分:0)

我很确定输出或立即窗口中存在绑定错误。

为什么?

因为你的控件正在集合实体中寻找SomeProperty,而不是那里。

您建议的属性可在Page ViewModel级别获得。

因此这样做

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