在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; }
}
答案 0 :(得分:2)
您的Task
类需要实现INotifyPropertyChanged接口,以便一旦基础数据发生任何变化,它就可以告诉WPF UI现在已经发生了变化,现在更新/刷新您的控件
答案 1 :(得分:2)
您的任务类需要实现INotifyPropertyChanged
答案 2 :(得分:2)
您必须将第一个ListBox
SelectedItem
绑定到Task
模型的对象,并为SelectionChanged
添加事件处理程序。在此事件中,您必须按选定的任务模型填充日志,您还必须在班级中实施INotifyPropertyChanged
。
答案 3 :(得分:2)
在我看来,第二个绑定根本不起作用,因为DataContext
是Tasks
的可枚举,并且枚举本身没有名为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。