gpt4 book ai didi

wpf - 通过 ViewModel MVVM WPF 设置 Listbox 或 ComboBox 的 SelectedItem

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

目标:通过 xaml 将 ListBox(或 ComboBox)的 SelectedItem 绑定(bind)到对象的实例后,我想通过 View 模型设置对象的选定实例并让它反射(reflect)在 ListBox 或 ComboBox 上。

<ComboBox x:Name="cboServers" HorizontalAlignment="Left" Margin="535,694,0,0" VerticalAlignment="Top" Width="225"
ItemsSource="{Binding Settings.Servers}"
SelectedItem="{Binding Settings.SelectedServer, Mode=TwoWay}"
DisplayMemberPath="UserFriendlyName">

C# 模型查看代码
public ObservableCollection<AutoSyncServer> Servers { get; set; }

private AutoSyncServer _selectedServer;

public AutoSyncServer SelectedServer
{
get { return _selectedServer;}
set
{
_selectedServer = value;
OnPropertyChanged("SelectedServer");
}
}

列表或组合框正确填充。选择 ListBox 或 ComboBox 上的项目将正确设置 SelectedServer 对象。

但是,如果我尝试在 C# 中编写一个 set 语句,例如:
Servers.Add(newServer);
SelectedServer = newServer;

ListBox 或 ComboBox 将正确添加项,并且 SelectedServer 对象将在 MVVM 模型上正确设置,但前端不会反射(reflect)此选择。

在这种特定情况下,会读取一个 xml 文件,说明用户最后选择的内容,并且当窗口打开时,ComboBox 没有选择任何内容(尽管服务器都在其中正确加载)

这里缺少什么?

最佳答案

SelectedItem 中的实际对象必须是在 Servers 中找到的对象实例收藏,在 Object.ReferenceEquals(a, b)感觉。不仅仅是相同的名称和 ID(或其他)属性;相同的确切类实例。

人们遇到这种情况的经典案例是在多个地方反序列化等效项目。 Servers有一组反序列化的 AutoSyncServer实例和 Settings.SelectedServer是一个单独反序列化的 AutoSyncServer实例,它与 Servers 中的一项具有相同的属性值.但它仍然是一个不同的对象,ComboBox无法知道您另有打算。

您可以覆盖 AutoSyncServer.Equals()如果 AutoSyncServer 的两个实例返回 true在逻辑上是等价的。我不喜欢这样做,因为它改变了 = 的语义。该类(class)的运算符(operator),以前曾咬过我。但这是一种选择。

另一种选择是拥有一个AutoSyncServer 的规范静态集合。并确保每个类都从中获取实例。

鉴于上述情况,我不明白为什么这段代码不起作用:

Servers.Add(newServer);
SelectedServer = newServer;

一次 newServerServers ,它应该是可选的。我测试了它,它对我有用,正如你所期望的那样。

关于wpf - 通过 ViewModel MVVM WPF 设置 Listbox 或 ComboBox 的 SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907823/

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