我有一个看起来像这样的列表框:
<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.ItemTemplate DataTemplate 基于绑定动态更新?