繁体   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