【发布时间】:2017-07-29 21:06:58
【问题描述】:
来自新手的基本问题。我一直坚持这一点,并阅读了很多关于 SO 的材料和几个类似的问题;希望不是一个完全重复的问题。我尽可能地简化了代码。
我正在尝试根据 ComboBox 中的选择使 ListView 显示过滤后的 ObservableCollection) 属性(作为 ItemsSource?)。 具体来说,哪些“会议”与此“协调员”相关。
我在运行时没有看到输出中的任何数据错误,并且调试显示属性更新正确,但 ListView 保持空白。我试图避免视图上的任何代码隐藏,目前没有。
谢谢!
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));
}
}
XAML:
<Window.Resources>
<local:ViewModel x:Key="VM"></local:ViewModel>
</Window.Resources>
<DockPanel DataContext="{StaticResource ResourceKey=VM}">
<ComboBox Margin="10" ItemsSource="{Binding ComboProperty}" SelectedItem="{Binding CoordinatorSelected}" DockPanel.Dock="Top"/>
<ListView Margin="10" ItemsSource="{Binding ListProperty, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="ClientName"/>
</DockPanel>
更新:
这似乎表明 lambda 正在返回一个会议对象,但对会议的分配失败。这可能是铸造错误吗?
再次感谢。
【问题讨论】:
-
这里不需要该选项,仅使用源代码 -
ItemsSource="{Binding ListProperty, UpdateSourceTrigger=PropertyChanged}" -
请注意,
UpdateSourceTrigger=PropertyChanged对单向绑定没有影响。它控制 TwoWay 或 OneWayToSource 绑定如何更新其源属性。