2016-12-06 4 views
0

私はコード内の余分なバインディングを1つの辞書に圧縮する方法を探しています。辞書にIsEnabledなどのWPFプロパティをバインドする

private Dictionary<string, bool> _myDict; 
    public Dictionary<string, bool> MyDictionary 
    { 
     get 
     { 
      return _myDict; 
     } 
     set 
     { 
      _myDict = value; 
     } 
    } 

非常にシンプル:私のViewModelで

私は辞書を持っています。正面では、IsEnabledを辞書エントリにバインドできるようにしたいと考えています。私はKVP ("FirstBorder", false)を持っている場合たとえば、私はでIsEnabledがfalse

<Border Width="30" Height="25" IsEnabled="{Binding MyDictionary[FirstBorder]}"> 

に設定するには、この境界線をたいと思い、このコードは実際には動作しません - 私は私がしなければならないだろう何を探していますDictionaryに文字列Keyを指定し、そのValueに基づいてプロパティを設定できるようにするためです。それも可能ですか?

答えて

1

辞書は、さまざまな理由でバインドすることが絶対に最悪です。 INotifyPropertyChangedを実装するカスタムタイプ(コレクション内のTItem)に対してKeyedCollectionを使用する方が良いでしょう。値にアクセスするためにキーを使用し、値が変更されたときにプロパティー変更通知を使用する利点があります。

本当に悪い場合は、KeyedCollection実装でINotifyCollectionChangedを実装してください。それは嫉妬します。

0

辞書の文字列キーを指定してその値に基づいてプロパティを設定できるようにするには、何が必要かを探しています。それも可能ですか?

はい

、これは動作するはずです:

public partial class MainWindow : Window 
{ 
    private Dictionary<string, bool> _myDict; 
    public Dictionary<string, bool> MyDictionary 
    { 
     get 
     { 
      return _myDict; 
     } 
     set 
     { 
      _myDict = value; 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     _myDict = new Dictionary<string, bool>(); 
     _myDict.Add("FirstBorder", true); 
     DataContext = this; 
    } 
} 



<Button Content="Button" Width="30" Height="25" IsEnabled="{Binding MyDictionary[FirstBorder]}" /> 

があなたのMyDictionaryプロパティを持つオブジェクトを使用すると、有効/無効にしようとしているビュー内の要素のDataContextのであることを確認してください。

編集:注DictionaryクラスはINotifyPropertyChangedインターフェイスを実装し、変更通知を発生させていないので、あなたは、実行時に動的に辞書にブール値を更新したときにビュー内の要素のステータスが動的に更新されないこと。

あなたはこれをしたい場合は、明示的バインディング更新する必要があります次のいずれか

_myDict["FirstBorder"] = true; 
var be = button.GetBindingExpression(Button.IsEnabledProperty); 
if (be != null) 
    be.UpdateTarget(); 

...または正しくINotifyPropertyChangedのを実装するクラスにバインドします。

+0

UpdatePropertyは必要ありませんか? – Skyl3lazer

+0

私はあなたが何を意味するか分かりません。辞書からUIの値を更新することをお考えですか? – mm8

+0

この値は、プログラム全体で適宜更新されます。図示のコードを使用しても実際にはIsEnabledフラグは更新されません。 – Skyl3lazer

関連する問題