0

对于那些想知道的人来说,这是在自稳定算法工具的背景下。

假设我有几个类,Algorithm, Rule, Predicate, Action, Graph, 和Node, 定义如下:

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.NameAction.Name为 some 中的每个元素Algorithm.Rules

请注意我在这篇文章中使用的以下变量名称:

ListView algorithm_view;
Algorithm algorithm

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

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

在此处输入图像描述

4

1 回答 1

3

如果您DataContext在视图上设置正确,那么您可以将您Rules的属性绑定到该ListView.ItemsSource属性。然后将BindingGridViewColumn类中查找该集合的类型Rules,因此我们可以Bind直接在其中使用那些属性。您可以从 MSDN 上的ListView 类页面找到更多信息。您的 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接口是明智的。出于同样的原因,您还应该使用ObservableCollection<T>collection 。

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

于 2013-10-15T22:13:44.923 回答