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.ItemTemplateDataTemplateをオンザフライで更新する方法はありますか?

4

1 に答える 1

1

あなたはあなたの呼び出し"ModuleLoaded "の代わりに通過しています。これは、プロパティ値が変更されても、UIに通知されないため、元の状態が保持されることを意味します。"ModuleLoaded"OnPropertyChanged

それ以外は、あなたのWhere呼び出しは冗長です。電話する代わりに

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

あなたは単に呼び出すことができます

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