C# 使用数据绑定时未刷新listview
我有一个模型类Book,它包含一个Keywords属性:C# 使用数据绑定时未刷新listview,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个模型类Book,它包含一个Keywords属性: public class Book : INotifyPropertyChanged { private ObservableCollection<string> _keywords; ... public ObservableCollection<string> Keywords { get => _keywords; set
public class Book : INotifyPropertyChanged
{
private ObservableCollection<string> _keywords;
...
public ObservableCollection<string> Keywords
{
get => _keywords;
set
{
_keywords = value;
OnPropertyChanged("Keywords");
}
}
}
它或多或少可以工作,但有两个注意事项:
- 有时,我刚才单击的复选框会显示在组合框的复选框中,这不是预期的,而且很烦人
- 除了combobox之外,我还有一个组件textbox,其中包含listview的selectedItem的关键字列表:
public ObservableCollection<string> Keywords
{
get => _keywords;
set
{
_keywords = value;
OnPropertyChanged("Keywords");
OnPropertyChanged("KeywordsForTextbox");
}
}
最后,这里是我的主窗口中的textBox组件:
<TextBox x:Name="txb_Keywords"
Grid.Column="1"
Width="500"
Text="{Binding ElementName=listBoxBooks,Path=SelectedItem.KeywordsForTextbox,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
为什么该复选框出现在组合框的文本框中?为什么不刷新另一个文本框
谢谢。问题是,在修改“关键字”集合时,实际的“关键字”属性不会更改。它仍然是同一个集合对象。只有对象的属性(项)更改 在Book类中,可以使用方法进行添加、删除和通知属性的更改
public void AddKeyword(string name)
{
Keywords.Add(name);
OnPropertyChanged("Keywords");
}
public void RemoveKeyword(string name)
{
Keywords.Remove(name);
OnPropertyChanged("Keywords");
}
然后像这样改变你的活动
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
CheckBox cb = (CheckBox)sender;
var content = (string)cb.Content;
var book = ((Book)listBoxBooks.SelectedItem);
bool clicked = cb.IsChecked.Value;
if (clicked)
book.AddKeyword(content);
else
book.RemoveKeyword(content);
}
它能工作,我理解它为什么能工作,但我仍然不理解它为什么以前不能工作,毕竟ObservableCollection的目的是在它的一个元素发生变化时引发一个事件……就是这样。@lolveley我相信ObservableCollection只会在集合发生变化时发出通知,即,添加或删除项目-我认为它不会监视集合项目属性的更改。除非单个项正在实现INotifyPropertyChanged,否则控件不知道-集合项不会以某种方式继承INotifyPropertyChanged,因为它们位于OC中。至少,这是我的理解。
<TextBox x:Name="txb_Keywords"
Grid.Column="1"
Width="500"
Text="{Binding ElementName=listBoxBooks,Path=SelectedItem.KeywordsForTextbox,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
public void AddKeyword(string name)
{
Keywords.Add(name);
OnPropertyChanged("Keywords");
}
public void RemoveKeyword(string name)
{
Keywords.Remove(name);
OnPropertyChanged("Keywords");
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
CheckBox cb = (CheckBox)sender;
var content = (string)cb.Content;
var book = ((Book)listBoxBooks.SelectedItem);
bool clicked = cb.IsChecked.Value;
if (clicked)
book.AddKeyword(content);
else
book.RemoveKeyword(content);
}