0

我有一个派生自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 的情况下纠正这个问题?

4

0 回答 0