[英]Binding a control property to a User Setting that is bound to another property?
最終(我希望)跟進此問題-
我想將此用戶控件的Color屬性綁定到一個User Settings屬性,該屬性將傳播到其他幾個控件。
我已經在代碼中做到了這一點(准確地說是XAML),但是對用戶控件所做的更改並未傳播到應該接收它們的控件中。
在過去,我看過這項工作(使用一個簡單的Slider控制“邊框寬度”):但是,這沒有用。 這是有問題的XAML。
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:S="clr-namespace:EQLControls.Properties"
xmlns:Components="clr-namespace:WPFTools.Components;assembly=WPFTools"
xmlns:Converters="clr-namespace:WPFTools.Classes.Converters;assembly=WPFTools"
x:Class="EQLControls.Controls.UCPlayerPanel"
mc:Ignorable="d"
BorderThickness="{Binding PlayerBorderSize}"
FontFamily="{Binding PlayerFontFamily}"
FontWeight="{Binding PlayerFontWeight}"
Height="50" Width="100">
<UserControl.Background>
<LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
<GradientStop Color="{Binding PlayerBGColor1}"/>
<GradientStop Color="{Binding PlayerBGColor2}" Offset="1"/>
</LinearGradientBrush>
</UserControl.Background>
<UserControl.BorderBrush>
<SolidColorBrush Color="{Binding PlayerBorderColor}"/>
</UserControl.BorderBrush>
<UserControl.DataContext>
<S:Settings/>
</UserControl.DataContext>
我有一個控件必須控制項目中“設置”(雙向綁定)的PlayerBGColor1和PlayerBGColor2,但是所做的更改不會(即時地,無論如何)反映在應該從控件接收這些更改的用戶控件上。
這是用於控件的綁定的XAML,這些控件應該處理UserSettings中的PlayerBG1和PlayerBG2顏色:
<Controls:ColorDefiner Color="{Binding PlayerBGColor2, Mode=TwoWay}" Width="Auto" Height="Auto"/>
<Controls:ColorDefiner Color="{Binding PlayerBGColor1, Mode=TwoWay}" Width="Auto" Height="Auto"/>
我在這里試圖實現的目標是否可能,或者我需要找到另一種方法來做到這一點?
好的,我可能會對這個問題有一個答案-問題(我認為)是,通過將Dependency屬性綁定到我的用戶設置時,我取消了已經存在的綁定,這樣做時Dependency屬性失去了它的來源,並且不再改變。 為了防止這種情況,我必須在用戶控件中編寫一個CallBack方法,該方法將在顏色更改時引發一個事件,並直接更新settings屬性。 然后,所有讀取該設置的內容都會更新-
public partial class ColorDefiner : UserControl {
private event EventHandler<Color> ColorChangedEvent;
public event EventHandler<Color> ColorChanged{
add{this.ColorChangedEvent += value;}
remove{this.ColorChangedEvent -= value;}
}
#region Dependency Properties
public static readonly DependencyProperty
ColorProperty = DependencyProperty.Register( "Color", typeof( Color ), typeof( ColorDefiner ), new FrameworkPropertyMetadata(
Colors.Black, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ColorDefiner.OnColorPropertyChanged ) );
private static void OnColorPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e ) {
ColorDefiner CD = d as ColorDefiner;
if ( CD.ColorChangedEvent != null )
CD.ColorChangedEvent( CD, (Color)e.NewValue );
}
#endregion
然后,就像綁定事件處理程序一樣簡單-
public UCGradientTool( ) {
InitializeComponent( );
this.cdFirstColor.ColorChanged += ( S, E ) => Settings.Default.PlayerBGColor1 = E;
this.cdSecondColor.ColorChanged += ( S, E ) => Settings.Default.PlayerBGColor2 = E;
}
我已經對此進行了測試,並且可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.