我對WPF比較陌生,遇到了用戶控件的一些困難。WPF:動態更改相同類型的所有用戶控件的依賴項屬性值
請考慮以下情形: 我有一個用戶控件WPF應用程序,說
MySpecialButtonControl
這個「按鈕」有兩儀「舊式」和「newStyle」(由枚舉「AppearanceStyle規定「),它們由一個依賴屬性具有名稱
MyLayoutProperty
回調函數必須進行這改變了佈局的代碼控制。 下面是我想要做的: 我需要在運行時在代碼隱藏文件中立即更改此窗口中用戶控件的所有(!)實例的外觀。
綁定(例如)一個屬性到UC的各個實例像
Binding binding = new Binding("AppearanceStyle");
binding.Source = myOptionsClass;
this.myButton.SetBinding(UserControls.MySpecialButtonControl.MyLayoutProperty, binding);
工作得很好。但是,如何直接更改所有UC實例的依賴屬性,而無需遍歷UCs集合等?有沒有什麼方法可以在WPF/C#中實現這一點?
我試圖通過使用樣式來解決這個問題,但是由於它已經在使用中(並且使用這種樣式的UCs已經被繪製),所以在運行時改變由所有UCs本身共享的樣式是不可能的。
接下來,我試圖用一個動態資源在風格上是這樣的:
<uc:MySpecialButtonControl x:Key="myFakeButton" ></uc:MySpecialButtonControl >
<Style x:Key="myButtonStyle" TargetType="uc:MySpecialButtonControl ">
<Setter Property="MyLayoutProperty" Value="{DynamicResource myFakeButton}"></Setter>
</Style>
這讓我在運行時更改「MyLayoutProperty」爲「myFakeButton」這是我想要的一半,但即使谷歌搜索一段時間後,我仍然無法找到一種方法將「myFakeButton」的「MyLayoutProperty」綁定到我真正需要的setter上。
任何幫助將不勝感激!
更新: 我試圖執行由邁克爾提供的解決方案,但不幸的是,我得到了以下異常:
PropertyMetadata is already registered for type 'MySpecialButtonControl'.
一些google搜索後(見MSDN)我發現OverrideMetadata通話應該放在我做的「MySpecialButtonControl」的靜態構造函數中:
static MySpecialButtonControl()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(MySpecialButtonControl),
new FrameworkPropertyMetadata(typeof(MySpecialButtonControl)));
}
Now ,應用程序編譯。現在它完美地工作。
如果將所有控件綁定到myOptionsClass對象,並且此對象作爲單例實現(只有一個活動的類實例),則只需更改myOptionsClass的綁定屬性即可更新所有控件。如果myOptionsClass實現了INotifyPropertyChanged或者使用了依賴屬性,那麼應該將已更改的值自動複製到UC的每個實例(這就是數據綁定的全部內容) –
感謝這個想法 - 它可以將UCs手動綁定到Dependency屬性,但這不是我想要的:我不想爲每個控件手動執行數據綁定。假設我在代碼的某個地方動態地創建了一個新的UC(可能是一個非常複雜的場景),並且「忘記」將它綁定到myOptionClass。 =>然後通過改變Dependcy屬性來改變它的外觀。 =>沒有一個好的代碼維護。 – user2539206