【问题标题】:Hide a usercontrol present in Datagrid隐藏 Datagrid 中存在的用户控件
【发布时间】:2014-08-21 16:04:07
【问题描述】:

我有一个用户控件,我将它包含在我的数据网格列中。 但是我想根据某些条件隐藏该用户控件。 我尝试绑定该用户控件的可见性,但这不起作用。我不知道为什么会这样。

<DataGrid>
... .
... 

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

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

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

【问题讨论】:

  • 即时或输出窗口是否有绑定错误。

标签: c# wpf user-controls wpfdatagrid visibility


【解决方案1】:

由于您的控件嵌套在 DataGrid 中,因此数据绑定的 DataContext 与您的 DataGrid 上下文相同。

因此,您可以选择将元素的可见性绑定到 DataGrid DataContext 的属性或将其绑定到相对 UI 父 DataContext 或代理的属性。

我将以下面的模型为例。

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 数据上下文):

假设您的数据网格绑定到 FooList,您可以直接绑定到 IsVisible 对象的 IsVisible 属性为:

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

解决方案 2(父上下文):

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

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

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

希望这会有所帮助。

【讨论】:

  • DataContext.IsVisible 应该是正确的方法。不是吗?
  • @Farzi 对您的问题有帮助吗?
【解决方案2】:

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

为什么?

因为您的控件正在寻找集合实体中不存在的SomeProperty

您建议的该属性在 Page ViewModel 级别可用。

所以这样做

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

【讨论】:

  • 如果属性为 bool 类型,您是否缺少 BoolenToVisibilityConverter。?
  • 在 Property Setter 和 Getter 上放一个断点,看看它是否在那里。首先它应该出现在片场,然后得到。
  • BindingExpression 路径错误:在“对象”“ViewModel”(HashCode=66609888)上找不到“InventoryVisibility”属性。 BindingExpression:Path=DataContext.InventoryVisibility; DataItem='MyUserControl' (Name='');目标元素是“MyUserControl”(名称=“MultiUnitCombo”);目标属性是“可见性”(类型“可见性”)
【解决方案3】:

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

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

否则显示 dataGrid 的完整 xaml。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多