【问题标题】:How to bind a GridViewColumn to a Property inside it's Collection Item in WPF如何将 GridViewColumn 绑定到 WPF 中其集合项内的属性
【发布时间】:2016-05-09 15:41:32
【问题描述】:

我为 GridView 的 GridViewColumn 创建了一个附加属性来隐藏/显示整个列。

    <GridViewColumn att:Visibility.IsVisible="{Binding ...}">

只要附加属性绑定到的属性存在于我的主视图模型(我的 gridView 的数据上下文)中,这就会起作用。 在一种情况下,列的可见性取决于我的列表项的属性(集合中的一个项目,它是我的 gridview 的 itemsource)。 我如何在这里绑定? 我可以访问 gridviewcolumn 的单元格模板内的项目属性,但不能访问 gridviewcolumn 本身。

我想要实现的是,我可以将附加属性绑定到我的列表项的属性。 有没有办法做到这一点?

编辑: 假设我有一堂课:

public class Item : INotifyPropertyChanged
{
  private string m_Text;
    public string Text
    {
        get
        {
            return m_Text;
        }
        set
        {
            m_Text= value;
            RaisePropertyChanged("Text");
        }
    }
    private bool m_IsVisible;
    public bool IsVisible
    {
        get
        {
            return m_IsVisible;
        }
        set
        {
            m_IsVisible = value;
            RaisePropertyChanged("IsVisible");
        }
    }
}

现在我有一个此类的 ObservableCollection 作为我的 ListView/GridView 的 ItemsSource。

public ObservableCollection<Item> Items;

在我的 xaml 中:

<ListView ItemsSource={Binding Items}>
 <ListView.View>
  <GridView>
    <GridView.Columns>
     <GridViewColumn att:Visibility.IsVisible="{Binding /*What goes here? Should bind to IsVisible of my Collection Item*/}">
      <GridViewColumn.CellTemplate>
       <DataTemplate>
        <TextBlock Text={Binding Text"/>    
        </DataTemplate>
      </GridViewColumn.CellTemplate>
     </GridViewColumn>
    </GridView.Columns>
  </GridView>
 </ListView.View>
</ListView/>

gridviewcolumn 的可见性现在应该取决于我的收藏项的“IsVisible”值。那个事件可能吗?

【问题讨论】:

  • 请发布您的列表属性

标签: wpf gridview data-binding


【解决方案1】:

您可以将附加属性绑定到集合的IsVisible 属性。我注意到您的 xaml 语法不正确导致编译错误。你的xaml 应该是这样的。

 <ListView ItemsSource="{Binding Items}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn att:Visibility.IsVisible="{Binding IsVisible}">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Text}"/>    
                            </DataTemplate>                              
                        </GridViewColumn.CellTemplate>                            
                    </GridViewColumn>                       
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

您也不需要在 Item 类上实现 INotifyPropertyChanged。你的 ObservableCollection 已经实现了 INotifyCollectionChanged ,它已经将更新 UI。你的Item 类应该是这样的

 public class Item
{
    public string Text { get; set; }
    public bool IsVisible { get; set; }
}

【讨论】:

  • 这是我尝试做的第一件事,但不知何故它不起作用,因为 wpf 在我的主视图模型中查找IsVisible,其中定义了Items,而不是在集合项上本身。此外,我必须实现INotifyPropertyChanged,因为INotifyCollectionChanged 仅在集合更改(添加/删除项目)时触发,而不是在集合项中的某些属性更改时触发。
最近更新 更多