C# 为什么此ListView不随绑定属性的更改而更改?
新手提出的基本问题。我一直被困在这个问题上,阅读了很多材料和一些类似的问题;希望这不是一个完全重复的问题。我尽可能地简化了代码 我正试图使ListView根据组合框中的选择显示一个过滤后的ObservableCollection)属性(作为ItemsSource?)。 具体来说,哪些“会议”与该“协调员”相关 在输出运行时,我没有看到任何数据错误,调试显示属性正确更新,但ListView保持空白。我试图避免视图中的任何代码,目前没有 谢谢C# 为什么此ListView不随绑定属性的更改而更改?,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,新手提出的基本问题。我一直被困在这个问题上,阅读了很多材料和一些类似的问题;希望这不是一个完全重复的问题。我尽可能地简化了代码 我正试图使ListView根据组合框中的选择显示一个过滤后的ObservableCollection)属性(作为ItemsSource?)。 具体来说,哪些“会议”与该“协调员”相关 在输出运行时,我没有看到任何数据错误,调试显示属性正确更新,但ListView保持空白。我试图避免视图中的任何代码,目前没有 谢谢 public class ViewModel : INo
public class ViewModel : INotifyPropertyChanged
{
private ObservableCollection<Meeting> meetings;
public ObservableCollection<Meeting> Meetings
{
get
{
return meetings;
}
set
{
meetings = value;
OnPropertyChanged("ListProperty");
OnPropertyChanged("Meetings");
}
}
private string coordinatorSelected;
public string CoordinatorSelected
{
get
{
return coordinatorSelected;
}
set
{
coordinatorSelected = value;
Meetings = fakeDB.Where(v => v.CoordinatorName == CoordinatorSelected) as ObservableCollection<Meeting>;
}
}
private ObservableCollection<string> comboProperty = new ObservableCollection<string> { "Joe", "Helen", "Sven" };
public ObservableCollection<string> ComboProperty
{
get
{
return comboProperty;
}
}
private ObservableCollection<Meeting> fakeDB = new ObservableCollection<Meeting>() { new Meeting("Joe", "Atlas"), new Meeting("Sven", "Contoso"), new Meeting("Helen", "Acme") };
public ObservableCollection<Meeting> ListProperty
{
get
{
return Meetings;
}
}
public class Meeting
{
public string CoordinatorName { get; set; }
public string ClientName { get; set; }
public Meeting(string coordinatorName, string clientName)
{
CoordinatorName = coordinatorName;
ClientName = clientName;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
公共类视图模型:INotifyPropertyChanged
{
非公开收集会议;
公开收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}
选出私人字符串协调员;
公共字符串协调人当选
{
得到
{
当选的返回协调员;
}
设置
{
选定的协调人=值;
会议=fakeDB,其中(v=>v.CoordinatorName==选定的协调员)为可观察的集合;
}
}
private ObservableCollection comboProperty=新的ObservableCollection{“Joe”、“Helen”、“Sven”};
公共可观测集合属性
{
得到
{
归还财产;
}
}
private ObservableCollection fakeDB=新的ObservableCollection(){新会议(“Joe”、“Atlas”)、新会议(“Sven”、“Contoso”)、新会议(“Helen”、“Acme”)};
公共可观察收集列表属性
{
得到
{
返回会议;
}
}
公开课
{
公共字符串协调名称{get;set;}
公共字符串ClientName{get;set;}
公开会议(字符串coordinatorName、字符串clientName)
{
CoordinatorName=CoordinatorName;
ClientName=ClientName;
}
}
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
XAML:
更新:
这似乎表明lambda正在返回会议对象,但分配给会议的操作失败。这可能是铸造中的错误吗
再次感谢。在触发PropertyChanged事件之前,始终必须更改属性的支持字段。否则,事件的使用者在读取属性时仍将获得旧值 更改会议属性设置器,如下所示:
public ObservableCollection<Meeting> Meetings
{
get
{
return meetings;
}
set
{
meetings = value;
OnPropertyChanged("ListProperty");
OnPropertyChanged("Meetings");
}
}
公众可观察收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}
在触发PropertyChanged事件之前,始终必须更改属性的支持字段。否则,事件的使用者在读取属性时仍将获得旧值
更改会议属性设置器,如下所示:
public ObservableCollection<Meeting> Meetings
{
get
{
return meetings;
}
set
{
meetings = value;
OnPropertyChanged("ListProperty");
OnPropertyChanged("Meetings");
}
}
公众可观察收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}
我相信我已经找到了两种解决同一问题的方法。错误指出@Clemens也是解决方案的一部分。如果我将ListProperty和Meetings更改为IEnumerable,那么Meetings属性问题就解决了。或者,这种方法不改变类型,我相信它使用过滤序列作为参数调用集合的构造函数
set
{
coordinatorSelected = value;
var filteredList = fakeDB.Where(v => v.CoordinatorName == coordinatorSelected);
Meetings = new ObservableCollection<Meeting>(filteredList);
OnPropertyChanged("ListProperty");
}
set
{
选定的协调人=值;
var filteredList=fakeDB.Where(v=>v.CoordinatorName==coordinatorSelected);
会议=新的可观察集合(filteredList);
OnPropertyChanged(“ListProperty”);
}
我相信我已经找到了两种解决同一问题的方法。错误指出@Clemens也是解决方案的一部分。如果我将ListProperty和Meetings更改为IEnumerable,那么Meetings属性问题就解决了。或者,这种方法不改变类型,我相信它使用过滤序列作为参数调用集合的构造函数
set
{
coordinatorSelected = value;
var filteredList = fakeDB.Where(v => v.CoordinatorName == coordinatorSelected);
Meetings = new ObservableCollection<Meeting>(filteredList);
OnPropertyChanged("ListProperty");
}
set
{
选定的协调人=值;
var filteredList=fakeDB.Where(v=>v.CoordinatorName==coordinatorSelected);
会议=新的可观察集合(filteredList);
OnPropertyChanged(“ListProperty”);
}
谢谢您抽出时间。接得好,我已经纠正了那个错误。我认为setter中的会议分配有问题-我将更新问题以修复代码,并包含调试器的屏幕截图。我想这可能是一个演员的问题,但我觉得这是对的。谢谢你抽出时间。接得好,我已经纠正了那个错误。我认为setter中的会议分配有问题-我将更新问题以修复代码,并包含调试器的屏幕截图。我认为这可能是一个强制转换问题,但在我看来是正确的。这里不需要这个选项,只使用源代码-ItemsSource=“{Binding ListProperty,UpdateSourceTrigger=PropertyChanged}”
注意UpdateSourceTrigger=PropertyChanged
对单向绑定没有影响。它控制双向或单向ToSource绑定更新其源属性的方式。此处不需要该选项,仅使用源工作-ItemsSource=“{Binding ListProperty,UpdateSourceTrigger=PropertyChanged}”
注意UpdateSourceTrigger=P