我有一个派生自ConfigurationElement
以下的类:
public class Item : ConfigurationElement, INotifyPropertyChanged
{
// Binding Properties.
[ConfigurationProperty("Name", DefaultValue = null, IsRequired = true)]
public string Name
{
get
{
return this["Name"] as string;
}
set
{
this["Name"] = value;
NotifyPropertyChanged();
}
}
// Methods.
private void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
// ctor.
public Item(string name)
{
Name = name;
}
// INotifyPropertyChanged members.
public event PropertyChangedEventHandler PropertyChanged;
}
我有一个包含 a 的视图ListView
,如下所示:
<DockPanel>
<Button DockPanel.Dock="Top" Content="Modify" Command="{Binding ModifyCommand}"/>
<ListView DockPanel.Dock="Bottom" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DockPanel>
视图的 ViewModel 如下:
public class MainViewModel : Observant
{
// Fields.
public Item m_SelectedItem;
// Binding Properties.
public ObservableCollection<Item> Items
{
get;
set;
}
public Item SelectedItem
{
get
{
return m_SelectedItem;
}
set
{
if (m_SelectedItem != value)
{
m_SelectedItem = value;
// Updated.
NotifyOfPropertyChange();
}
}
}
public RelayCommand ModifyCommand
{
get;
set;
}
// ctor.
public MainViewModel()
{
ModifyCommand = new RelayCommand(Modify_Execute);
Items = new ObservableCollection<Item>();
Items.Add(new Item("Bird"));
Items.Add(new Item("Bug"));
Items.Add(new Item("Cat"));
Items.Add(new Item("Dog"));
Items.Add(new Item("Fish"));
Items.Add(new Item("Sheep"));
Items.Add(new Item("Shrimp"));
}
private void Modify_Execute(object parameter)
{
m_SelectedItem.Name = string.Format("{0}-{1}", m_SelectedItem.Name, DateTime.Now.Millisecond);
}
}
whereObservant
是实现INotifyPropertyChanged
.
在 中选择一个项目后ListView
,我通过SelectedItem
属性更新了 ViewModel 中的项目(通过单击 Modify 按钮),并且进展顺利。但是,当我在修改当前项目后尝试选择另一个项目时,当前项目不会被取消选择,如下所示:
我知道Item
与使用字段的实现相比,属性 getter 和 setter 的实现不同。它是这样实现的,因为Item
它是从配置文件加载/持久化到配置文件的配置的一部分。
我的问题是:是否可以在不使用使用字段的 getter/setter 的情况下纠正这个问题?