如何绑定ListView以查看一组对象的特定属性?

时间:2013-10-15 21:01:06

标签: wpf listview data-binding

对于那些想要了解的人来说,这是一个自我稳定算法的工具。

假设我有几个课程,AlgorithmRulePredicateActionGraphNode,因此定义:

using System;
using System.Collections.Generic;
using System.Text;

namespace SMP {
    class Algorithm {
        public List<Rule> Rules { get; set; }

        public Algorithm() {
            Rules = new List<Rule>();
        }
    }

    class Rule {
        public Predicate Predicate { get; set; }
        public Action Action { get; set; }
    }

    class Predicate {
        public string Description { get; set; }
        public string Name { get; set; }
        public string Expression { get; set; }
    }

    class Action {
        public string Description { get; set; }
        public string Name { get; set; }
        public string Expression { get; set; }
    }
}

我想连接两列ListView,为Predicate.Name中的每个元素显示Action.NameAlgorithm.Rules

请注意我正在使用的以下变量名称:

ListView algorithm_view;
Algorithm algorithm

我知道我必须将DataContext的{​​{1}} algorithm_view设置为我的Algorithm实例algorithm_view.DataContext = algorithm,但我不知道如何表达在XAML中这样的集合。

如果它有助于描绘它,这里是界面的截图:

enter image description here

1 个答案:

答案 0 :(得分:2)

如果在视图上正确设置了DataContext,则可以将Rules属性绑定到ListView.ItemsSource属性。然后Binding中的GridViewColumn会查看集合Rules类型的类,因此我们可以Bind直接使用这些属性。您可以在MSDN上的ListView Class页面上找到更多信息。你的XAML应该是这样的:

<ListView ItemsSource="{Binding Rules}">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Predicate}" 
                Header="Predicate" />
            <GridViewColumn DisplayMemberBinding="{Binding Action}" 
                Header="Action" />
        </GridView>
    </ListView.View>
</ListView>

顺便说一句,在使用WPF时,如果希望在更改属性时更新UI和模型,则在数据类型类中实现INotifyPropertyChanged interface是明智的。出于同样的原因,您也应该使用ObservableCollection<T> collection

最后一点......你的标题目前有点误导,因为.NET中有一个名为Tuple的类,你的问题与它无关。