ListView.SelectedItem не изменяется при изменении свойства связанного ConfigurationElement
У меня есть класс, полученный из 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>
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
является частью конфигурации, которая загружается из / сохраняется в файл конфигурации.
Мой вопрос: возможно ли исправить это без использования метода получения / установки, который использует поле?