gpt4 book ai didi

c# - 为什么这个 ListView 不会随着绑定(bind)属性的变化而改变?

转载 作者:行者123 更新时间:2023-12-03 10:54:21 29 4
gpt4 key购买 nike

新手的基本问题。我一直坚持这一点,并阅读了很多关于 SO 的 Material 和几个类似的问题;希望不是一个完全重复的问题。我尽可能地简化了代码。

我正在尝试根据 ComboBox 中的选择使 ListView 显示过滤后的 ObservableCollection) 属性(作为 ItemsSource?)。
具体来说,哪些“ session ”与此“协调员”相关。

我在运行时没有看到输出中的任何数据错误,并且调试显示属性更新正确,但 ListView 保持空白。我试图避免 View 上的任何代码隐藏,目前没有。

谢谢!

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 正在返回一个 session 对象,但对 session 的分配失败。这可能是类型转换错误吗?

再次感谢。

最佳答案

在触发 PropertyChanged 事件之前,您始终必须更改属性的支持字段。否则,事件的使用者在读取属性时仍会获得旧值。

像这样更改 session 属性 setter :

public ObservableCollection<Meeting> Meetings
{
get
{
return meetings;
}
set
{
meetings = value;
OnPropertyChanged("ListProperty");
OnPropertyChanged("Meetings");
}
}

关于c# - 为什么这个 ListView 不会随着绑定(bind)属性的变化而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394066/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com