WPF数据绑定多个控件

时间:2011-07-31 18:54:56

标签: c# .net wpf xaml data-binding

在WPF中,我正在尝试绑定多个控件,但第二个控件在第一个控件更改时不会更改。

我有两个类:一个Task类和一个Log类,它作为一个集合存储在Task类中。下面的列表框绑定到任务,以及所选任务的内部日志。

问题是列表框在第一次加载时填充正常,但是如果我选择一个不同的任务,我希望日志更新到新任务的集合,但它不会改变从第一次加载时最初选择的任务开始。我错过了什么?

在设计师中:

    <ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
             Grid.Row="0" Grid.Column="0" Grid.RowSpan="2">
    </ListBox>
    <ListBox x:Name="listBoxLogs" 
             ItemsSource="{Binding Logs}" DisplayMemberPath="EntryDate"
             Grid.Row="1" Grid.Column="1">
    </ListBox>

在背后的代码中:

public MainWindow()
        {
            InitializeComponent();

            IMongoCollection<Task> tasks = DataManager.GetData();

            this.DataContext = tasks.AsQueryable();
        }

任务类:

public class Task : BusinessBase<Task>
{
    public ObjectId _Id { get; set; }
    public string Key { get; set; }
    public string Description { get; set; }
    public string Summary { get; set; }
    public string Details { get; set; }

    public IEnumerable<Log> Logs { get; set; }
    public IEnumerable<Link> Links { get; set; }
    public IEnumerable<String> RelatedKeys { get; set; }
    public IEnumerable<TaskItem> Items { get; set; }
}

5 个答案:

答案 0 :(得分:2)

您的Task类需要实现INotifyPropertyChanged接口,以便一旦基础数据发生任何变化,它就可以告诉WPF UI现在已经发生了变化,现在更新/刷新您的控件

答案 1 :(得分:2)

您的任务类需要实现INotifyPropertyChanged

http://msdn.microsoft.com/en-us/library/ms743695.aspx

答案 2 :(得分:2)

您必须将第一个ListBox SelectedItem绑定到Task模型的对象,并为SelectionChanged添加事件处理程序。在此事件中,您必须按选定的任务模型填充日志,您还必须在班级中实施INotifyPropertyChanged

答案 3 :(得分:2)

在我看来,第二个绑定根本不起作用,因为DataContextTasks的可枚举,并且枚举本身没有名为Logs的属性。您可以尝试使用IsSynchronizedWithCurrentItem并绑定当前项目:

<ListBox x:Name="listBoxTasks" ItemsSource="{Binding}" DisplayMemberPath="Key"
         Grid.Row="0" Grid.Column="0" Grid.RowSpan="2"
         IsSynchronizedWithCurrentItem="True"> <!-- Set this -->
</ListBox>
<ListBox x:Name="listBoxLogs" DisplayMemberPath="EntryDate"
         Grid.Row="1" Grid.Column="1"
         ItemsSource="{Binding /Logs}"> <!-- Note the slash which indicates a binding to the current item -->
</ListBox>

您还可以绑定到另一个SelectedItem的{​​{1}},但这会在控件之间引入冗余依赖关系。另请注意,如果更改数据对象中的任何属性,则需要实现其他回答者INotifyPropertyChanged提到的界面。

答案 4 :(得分:1)

我现在都在工作。我实现了INotifyPropertyChanged,虽然没有解决问题。

我现在正在使用MVVM模式。这有助于......我使用的NoRM库没有SelectionChanged事件。我创建了一个视图模型,并能够将这些模型转换为ObservableCollections。现在我只是在为Task类更改选择时设置Logs控件DataContext。