簡體   English   中英

將控件屬性綁定到綁定到另一個屬性的用戶設置?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM