2015-04-22 6 views
0

Final (я надеюсь) следовать до this вопроса -Связать свойство управления с пользовательской настройкой, привязанной к другому свойству?

Я хочу, чтобы связать свойство цвета этого пользователя Control к свойству Настройки пользователя, которые будут распространять на несколько других элементы управления.

Я сделал это в коде (XAML, если быть точным), но изменения, внесенные в User Control, не распространяются на элемент управления, который должен их получать.

В прошлом я видел эту работу (с простым слайдером, контролирующим ширину границы): Однако это не работает. Вот вопрос 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 для привязки для элементов управления, которые должны обрабатывать цвета PlayerBG1 и PlayerBG2 в UserSettings:

<Controls:ColorDefiner Color="{Binding PlayerBGColor2, Mode=TwoWay}" Width="Auto" Height="Auto"/> 
<Controls:ColorDefiner Color="{Binding PlayerBGColor1, Mode=TwoWay}" Width="Auto" Height="Auto"/> 

Это то, что я пытаюсь достичь возможно здесь, или мне нужно найти другой способ сделать это?

+0

У обоих элементов управления есть один экземпляр DataContext? – jhenninger

+0

Свойства 'PlayerBGColor1' и' PlayerBGColor2' сообщают об изменениях, т. Е. Они поднимают событие PropertyChanged? – Clemens

+0

@ jhenninger24 Они делают - они являются частью класса, который наследует класс ApplicationSettingsBase. – Will

ответ

0

Возможно, у меня есть ответ на этот вопрос. Проблема (я думаю) заключается в том, что, связывая свойство Dependency с моей настройкой пользователя, я сбиваю уже существующую привязку, и при этом свойство Dependency Is теряет его источник и больше не меняется. Чтобы этого избежать, я должен написать в User Control метод CallBack, который будет вызывать событие, когда цвет изменится и обновит свойство настроек напрямую. Затем, все, что чтение этой настройки будет обновляться -

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; 
    } 

Я проверил это, и это работает.

Смежные вопросы