我有一个派生自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;
}
我有一个包含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>
View的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);
}
}
其中Observant
是实现INotifyPropertyChanged
的基类。
在ListView
中选择一个项目之后,我会在ViewModel到SelectedItem
属性中更新项目(通过单击“修改”按钮),并且进展顺利。但是,当我在修改当前项目后尝试选择另一个项目时,当前项目不会被取消选择,如下所示:
我知道Item
与使用字段的实现相比,具有不同的属性getter和setter实现。它是这样实现的,因为Item
是从配置文件加载/持久保存到配置文件的配置的一部分。
我的问题是:如果不使用使用字段的getter / setter,是否可以更正?