当绑定的ConfigurationElement的属性发生更改时,ListView.SelectedItem不会更改

时间:2016-06-21 16:24:30

标签: c# wpf data-binding 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>

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属性中更新项目(通过单击“修改”按钮),并且进展顺利。但是,当我在修改当前项目后尝试选择另一个项目时,当前项目不会被取消选择,如下所示:

enter image description here

我知道Item与使用字段的实现相比,具有不同的属性getter和setter实现。它是这样实现的,因为Item是从配置文件加载/持久保存到配置文件的配置的一部分。

我的问题是:如果不使用使用字段的getter / setter,是否可以更正?

0 个答案:

没有答案