0

私のセットアップの簡単な説明:

免責事項: コードは、私がやりたいことを示すためだけのものです。たとえば、コマンド バインディングは、イベント トリガーなどで行われます。これはビルドすらできないと確信していますが、スペースを無駄にしたくありませんでした。

私の見解:

<ItemsControl ItemsSource="{Binding Items}">
   <ItemsControl.ItemTemplate>
       <DataTemplate>
           <StackPanel>
               <TextBlock Text="{Binding IsFavorite, Converter={StaticResource FavoriteConverter}" Tap="{Binding FavoriteCommand, CommandParameter={Binding}}"/>
               <TextBlock Text="{Binding Title}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

私のビューモデル:

public class ViewModel : ViewModelBase
{
    public IList<Item> Items { get; set; }
    public RelayCommand<Item> Favorite
    {
       get
       {
           return new RelayCommand<Item>(item =>
                {
                    item.IsFavorite = !item.IsFavorite;
                    RaisePropertyChanged(string.Empty);
                };
        }
     }
}

私のモデル:

public class Item
{
    public string Title { get; set; }
    public bool IsFavorite { get; set; }
}

*私の質問: *

INotifyPropertyChanged を実装せずに IsFavorite-Property を更新するにはどうすればよいですか? これはモデル クラスであり、1 つのプロパティを更新するためだけに ViewModel を作成するのは好きではありません。空の文字列で PropertyChanged を呼び出すとすべてが更新されると思いましたが、残念ながらそうではありませんでした。

*私の解決策: *

public class ItemViewModel : ViewModelBase
{
    public Item Model { get; private set; }
    public bool IsFavorite
    {
        get { return Model.IsFavorite; }
        set
        {
            Model.IsFavorite = value;
            RaisePropertyChanged("IsFavorite");
        }
    }
}
4

2 に答える 2

2

値にバインドしていて、実行時に値が変更されることが予想される場合は、実際に実装するINotifyPropertyChanged必要があります。これは、WPF のバインド システムがそのインターフェイスを使用して更新が必要な時期を認識するためです。

しかし、そうは言っても、実際のコレクション自体は変更されておらず、内部のアイテムの 1 つのプロパティのみが変更されているため、それが機能するかどうかは完全にはわかりませんが、コレクションPropertyChange全体の通知を発行することで回避できる可能性があります。Itemsコレクション。また、WPF は通常、プロパティが実際に変更されていない場合、プロパティを再評価する必要がないことを認識しています。

RaisePropertyChanged("Items");

機能しない場合は、アイテムを削除して再度追加してCollectionChange通知をトリガーすることもできますが、それも機能しない可能性があり、アプリケーションの設計によっては他の問題が発生する可能性があります。

// I may have the exact syntax wrong here
var index = Items.IndexOf(item);
var tmp = Items[index];
Items.Remove(tmp);
Items.Add(tmp, index);

しかし、実際にはクラスに実装INotifyPropertyChangedするのが最善です。Item

于 2013-05-14T12:54:30.200 に答える
0

使用してみてください:RaisePropertyChanged("Items");そして、Items コレクションを ObservableCollection にします。

INotifyPropertyChanged を実装する方が優れています。

于 2013-05-14T12:54:12.590 に答える