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;
}

次のように、を含むビューがあります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);
    }
}

whereObservantは を実装する基本クラスですINotifyPropertyChanged

でアイテムを選択した後、プロパティListViewを使用して ViewModel のアイテムを更新しSelectedItem([変更] ボタンをクリックして)、うまくいきました。ただし、現在のアイテムを変更した後に別のアイテムを選択しようとすると、次のように現在のアイテムが選択解除されません。

ここに画像の説明を入力

Itemフィールドを使用する実装と比較すると、プロパティのゲッターとセッターの実装が異なることは承知しています。Item構成ファイルからロード/永続化される構成の一部であるため、そのように実装されます。

私の質問は、フィールドを使用するゲッター/セッターを使用せずにこれを修正することは可能ですか?

4

0 に答える 0