我有一个如下所示的列表框:
<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根据绑定动态更新?
答案 0 :(得分:1)
您正在将"ModuleLoaded "
而不是"ModuleLoaded"
传递给OnPropertyChanged
来电。这意味着即使您的属性值发生更改,UI也不会获得有关它的信息,因此会保留其原始状态。
除此之外,您的Where
电话是多余的。而不是打电话
LoadingModules.Where(x => x.ModuleName == moduleInfo.ModuleName)
.FirstOrDefault();
你可以直接打电话
LoadingModules.FirstOrDefault(x => x.ModuleName == moduleInfo.ModuleName);