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 является частью конфигурации, которая загружается из / сохраняется в файл конфигурации.

Мой вопрос: возможно ли исправить это без использования метода получения / установки, который использует поле?

0 ответов

Другие вопросы по тегам