2016-12-06 372 views
0

我正在尋找一種方法來將我的代碼中的很多多餘的綁定壓縮到單個字典中。綁定WPF屬性,如IsEnabled到字典

在我的ViewModel我有一本字典:

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

很簡單。在前面我希望能夠將IsEnabled綁定到字典條目。舉例來說,如果我有KVP ("FirstBorder", false),那麼我想這個邊框設置爲具有的IsEnabled設置爲false

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

此代碼不實際工作 - 我在尋找什麼,我必須做能夠在Dictionary中指定一個字符串Key,並根據其值設置屬性。它甚至有可能嗎?

回答

1

詞典絕對是最糟糕的事情,因爲一些不同的原因而被綁定。更好地使用KeyedCollection針對執行INotifyPropertyChanged的自定義類型(集合中的TItem)。您可以獲得使用密鑰訪問值的好處,並在值更改時獲得屬性更改通知。

如果您真的想成爲笨蛋,請在您的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的。

編輯:注意,在視圖元素的狀態將不會動態更新,當您在運行時動態更新詞典中的布爾值,因爲字典類不實現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