我想更改由第二個依賴屬性(ViewType)的更改更改觸發的UserControl中的依賴項屬性(Mode)的狀態。如何編寫數據觸發器,以基於第二個依賴項屬性的更改更改依賴項屬性的值?
我試圖定義一個DataTrigger如下,但由於某種原因它不工作:
<UserControl.Resources>
<Style TargetType="{x:Type UserControls:MyUserControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
<Setter Property="Mode" Value="Logon"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
爲了驗證我的結合是正常工作我寫了下面的測試XAML在相同的用戶控件:
<Style x:Key="butstyle">
<Style.Triggers>
<DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
<Setter Property="Control.Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
當我將此樣式分配給按鈕時,我發現前景顏色在正確的時間變爲白色,這證明我的Binding to ViewType正在工作。
我似乎需要使用usercontrol.resources下的樣式(如上面的第一個代碼塊),但「Mode」屬性從不設置。
這是正確的方法嗎?如果可能的話,我想盡量保留在XAML中,但是如果觸發器與視覺元素沒有直接關係,觸發器應該如何工作,我不太確定。
在相關的情況下,「ViewType」綁定屬性在父UserControl中定義,並且「Mode」屬性在MyUserControl上定義。
更新:
我用了一個轉換器,以找出我的觸發器被調用,但是我的二傳手是不是要訂婚的某些原因。這是我正在嘗試設置的DP的代碼。調用neitehr set()和OnModeChanged()的斷點。我的依賴屬性有什麼問題嗎?
public enum ModeStates { Logon, NextState }
public ModeStates Mode
{
get { return (ModeStates)GetValue(ModeProperty); }
set { SetValue(ModeProperty, value); }
}
protected static readonly DependencyProperty ModeProperty = DependencyProperty.Register(
"Mode", typeof(ModeStates), typeof(MyUserControl),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnModeChanged))
);
private static void OnModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// .......
}
更新:
我能夠使用DependencyPropertyDescriptor.AddValueChanged()來解決一個非常乾淨的時尚我的問題。
這是評論,而不是aswer,因爲我沒有測試它。你可以用轉換器來做到這一點。你有沒有理由不能在你綁定的對象中做這件事? – Paparazzi
如何使用DependencyPropertyDescriptor.AddValueChanged()來解決你的問題?你能提供一些代碼嗎? – Gintama
對不起,這篇文章來自很多年以前,我很久以前就停止了這個語言和框架的工作,我也不記得細節。 – Locksleyu