【发布时间】:2017-03-20 15:37:47
【问题描述】:
目标:通过 xaml 将 ListBox(或 ComboBox)的 SelectedItem 绑定到对象的实例后,我想通过视图模型设置对象的选定实例并让它反映在 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 会正确添加项,并且在 MVVM 模型上会正确设置 SelectedServer 对象,但前端不会反映此选择。
在这种特定情况下,会读取一个 xml 文件,说明用户最后选择的内容,当窗口打开时,ComboBox 没有选择任何内容(尽管服务器都正确加载在其中)
这里缺少什么?
【问题讨论】:
-
调试时检查任何绑定问题错误。
-
什么是“OnServerChanged”?您的视图模型类应该实现 INotifyPropertyChanged 接口并引发 PropertyChanged 事件。是吗?
-
OnServerChanged 与此问题无关,因为此问题也出现在其他领域。 OnServerChange 让我知道服务器已更改,以便可以检索服务器对象。我将编辑这个问题。
-
@mm8 有一种常见的模式,即对特定属性及其值的变化特别感兴趣,因此您编写带有专用 EventArgs 的
FooChanged事件,以避免消费者在处理时相对烦恼PropertyChanged并检查属性名称。 -
您实际上是如何设置 SelectedServer 属性的?
标签: wpf mvvm selecteditem