TextBlock
雇用されている労働者の数を反映するはずのプロパティにバインドされている WPF/MVVM (MVVM Light フレームワークを使用) にゲームがあります。バインディングが無傷であることを確認しましたが、更新できません。
これTextBlock
が私の見解です:
<TextBlock x:Name="WorkersTextBlock"
FontFamily="Pericles"
DataContext="{Binding Guilds[0]}"
Text="{Binding Workers.Count,
StringFormat=Workers : {0},
FallbackValue=Workers : 99}" />
ビューモデルのプロパティ:
public ObservableCollection<Guild> Guilds
{
get { return DataManager.Data.Guilds; }
}
Worker
また、私のビューモデルでは、 aの Employer プロパティを変更するコマンド:
private void ExecuteHireWorkerCommand()
{
if (SelectedWorker == null)
return;
SelectedWorker.Employer = DataManager.Data.Guilds[0];
Gold -= SelectedWorker.Salary;
_workerCollectionView.Refresh();
}
すべてのデータを保持するシングルトン クラスである DataManager では、次のようになります。
private ObservableCollection<Guild> _guilds = new ObservableCollection<Guild>();
public ObservableCollection<Guild> Guilds
{
get { return _guilds; }
}
private ObservableCollection<Worker> _workers = new ObservableCollection<Worker>();
public ObservableCollection<Worker> Workers
{
get { return _workers; }
}
Guild
モデルでは:
public ObservableCollection<Worker> Workers
{
get { return DataManager.Data.Workers.Where(w => w.Employer == this).ToObservableCollection(); }
}
の Employer プロパティWorker
は次のとおりです。
public Guild Employer { get; set; }
最後に、私の拡張メソッド (これが問題の原因だと思います):
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
メッセージボックスは、コマンドを介してWorker
'Employer プロパティが適切に更新されていることを確認しますが、私が試したものは何も更新しませんTextBlock
. RaisePropertyChanged
ここにリストしたすべてのものを実装しようとしましたが、うまくいきませんでした。
データの初期化時に、コンストラクター内での Employment プロパティをWorker
正しいギルドに設定すると、数値はTextBlock
正しく表示されますが、その後は更新されません。プロパティの LINQ フィルタリングと拡張メソッドWorkers
がこの問題を引き起こしているのではないかと推測していますが、間違っている可能性もあります。
これを機能させる方法について誰かがアイデアを持っている場合は、ぜひ聞いてください。この問題に関するアドバイスは大歓迎です。さらにコードや情報が必要な場合は、お問い合わせください。
ありがとう。
更新: Ron は正しい道を進んでいると思います。拡張メソッドがバインディングを壊している可能性があります。Guild
この場合、バインディングを壊さずに Workers プロパティをフィルタリングする方法について誰かアドバイスをいただけますか? また、セッターの問題に関する限り、Workers プロパティにセッターを追加しましたが、実際には起動しません。