【发布时间】:2023-03-23 14:54:01
【问题描述】:
在某些情况下,如果用户在组合框中选择了一个项目,它必须自动更改为另一个项目
视图模型
public class VM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
private string selected;
public string Selected
{
get { return selected; }
set
{
if (selected != value)
{
selected = value;
OnPropertyChanged("Selected");
}
}
}
private ObservableCollection<string> collection;
public ObservableCollection<string> Collection
{
get { return collection; }
set
{
collection = value;
OnPropertyChanged("Collection");
}
}
public VM()
{
this.Collection = new ObservableCollection<string>(new string[] { "A", "B", "C" });
this.Selected = "A";
this.PropertyChanged += VM_PropertyChanged;
}
void VM_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.Selected = "C";
}
}
查看
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Grid>
<ComboBox ItemsSource="{Binding Collection}" SelectedValue="{Binding Selected}"/>
</Grid>
<Label Content="{Binding Selected, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Window>
所以,在这个例子中,无论我选择什么,它应该在组合框和标签上都显示“C”,但“C”只显示在标签上,这意味着 ViewModel 已更新但视图未更新.
这里的问题似乎是尝试从 PropertyChanged 方法更改属性。
可能出了什么问题?
【问题讨论】:
-
您的视图模型使用属性
Collection而您的视图绑定到Coleccion是否只是复制/粘贴错误? -
为什么将
UpdateSourceTrigger=PropertyChanged添加到无法更新源的属性的绑定中?为什么您希望您的 ComboBox 将新的 ObservableCollection 分配给Collection? -
@wablab 是的,原始代码是西班牙语,谢谢
-
我知道,你是对的,我已经习惯了这样写,已经成为一种不好的做法
-
不确定您的最终目标是什么,但也许您可以实现并绑定到
INotifyPropertyChanging.PropertyChanging,并为此在事件处理程序中设置Selected。这个我没试过,不知道有没有用。实际上,您甚至可能不需要绑定它;您可能能够在视图模型本身内处理所有这些。 (但如果你打算这样做,那么在设置器本身内更改Selected的值可能是有意义的。)
标签: c# wpf mvvm combobox propertychanged