次のようなリストボックスがあります。
<ListBox
ItemsSource="{Binding LoadingModules}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Opacity="{Binding ModuleLoaded, Mode=TwoWay,
Converter={StaticResource BoolToDoubleConverter}}"
Text="{Binding ModuleName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ModuleLoaded = trueのアイテムは、不透明度が20%である必要があります。
これは、設計時にうまく機能します。しかし、実行時にはこれは起こりません。
これは、実際に値を変更する私のロジックです。
private void OnModuleLoaded(ModuleInfo moduleInfo)
{
LoadingModules.Where(x => x.ModuleName == moduleInfo.ModuleName)
.FirstOrDefault().ModuleLoaded = true;
}
私のLoadingModuleクラスには、次のように定義されたModuleLoadedがあります。
private bool moduleLoaded;
public bool ModuleLoaded
{
get { return moduleLoaded ; }
set
{
if (!object.Equals(moduleLoaded , value))
{
moduleLoaded = value;
OnPropertyChanged("ModuleLoaded ");
}
}
}
私がそれを機能させることができた唯一の方法は、これを行うことです:
var foundModule = LoadingModules.Where(x => x.ModuleName==moduleInfo.ModuleName)
.FirstOrDefault();
LoadingModules.Remove(foundModule);
foundModule.ModuleLoaded = false;
LoadingModules.Add(foundModule);
これは機能するので、バインディングとコンバーターが接続されていることがわかります。
しかし、削除して再追加することは実際には解決策ではありません。そして、私のイベントが完璧な順序で到着しないため、問題が発生します。
バインディングに基づいてListBox.ItemTemplateDataTemplateをオンザフライで更新する方法はありますか?