最初にコレクション内のアイテムの数を表示し、次に値の合計を表示するために、2 つのラベルにバインドする必要がある ObservableCollection があります。
最初のラベルはコレクションの count プロパティにバインドされ、2 番目のラベルは ObservableCollection に直接バインドされ、コンバーターを使用してすべてのアイテムの合計を計算します
XAMLは次のようになります
<Grid>
<ListBox Name="itemList" ItemsSource="{Binding DataList}"/>
<Label Name="lblcount" Content="{Binding DataList.Count}" />
<Label Name="lblTotal" Content="{Binding DataList, Converter={StaticResource calculateTotalConvertor}" />
</Grid>
私のVMにはこのようなコレクションがあります
ObservableCollection<int> data = new ObservableCollection<int>();
public ObservableCollection<int> DataList
{
get { return data; }
set { data = value; }
}
私のコンバーターコードは
public class CalculateTotalConvertor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<int> collection = value as ObservableCollection<int>;
return collection.Sum();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
問題は、DataList、ListView、およびアイテムの数を示すラベルに新しいアイテムを追加することですが、「lblTotal」は合計数で更新されません。
基本的に、 ObservableCollection の変更時にバインディングを強制的に評価する方法は? ListView または DataGrid では直接機能しますが、 label では機能しませんか?
この問題は、VM でプロパティを作成して合計を表示し、コレクションが更新されたときにプロパティの変更を発生させることで解決できることを知っていますが、それよりも優れた解決策はありますか?
もちろん、これは実際の問題を簡略化したものです。ViewModel とコレクション、つまりサード パーティ コントロールにアクセスすることはできません。ラッパー ユーザー コントロールを作成しており、その内部コレクションへのビューとの相対的なバインディングがあります。