Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用数据绑定时未刷新listview_C#_Wpf_Data Binding - Fatal编程技术网

C# 使用数据绑定时未刷新listview

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

我有一个模型类Book,它包含一个Keywords属性:

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);
}