通过绑定更新wpf ListBox项的不透明度

时间:2012-08-11 20:35:17

标签: c# .net wpf data-binding

我有一个如下所示的列表框:

<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根据绑定动态更新?

1 个答案:

答案 0 :(得分:1)

您正在将"ModuleLoaded "而不是"ModuleLoaded"传递给OnPropertyChanged来电。这意味着即使您的属性值发生更改,UI也不会获得有关它的信息,因此会保留其原始状态。

除此之外,您的Where电话是多余的。而不是打电话

LoadingModules.Where(x => x.ModuleName == moduleInfo.ModuleName)
              .FirstOrDefault();

你可以直接打电话

LoadingModules.FirstOrDefault(x => x.ModuleName == moduleInfo.ModuleName);