0

我有一个看起来像这样的列表框:

<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 基于绑定动态更新?

4

1 回答 1

1

您正在传递"ModuleLoaded "而不是传递"ModuleLoaded"给您的OnPropertyChanged呼叫。这意味着即使您的属性值发生更改,UI 也不会得到通知,因此会保留其原始状态。

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

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

你可以简单地打电话

LoadingModules.FirstOrDefault(x => x.ModuleName == moduleInfo.ModuleName);
于 2012-08-11T20:40:24.770 回答