2016-06-23 5 views
0

Я пытаюсь создать WPF UserControl, который содержит 2 кнопки. Я использую этот UserControl в окне и применяю значение Window.Resource, чтобы установить фон одной кнопки внутри пользовательского элемента управления.WPF UserControl привязка свойств

В настоящее время у меня есть:

  • window.xaml

    <Window.Resources> 
        <SolidColorBrush Color="Brown" x:Key="theBG"></SolidColorBrush> 
    </Window.Resources> 
    <theControl:TheControl 
        x:Name="TheControl" 
        buttonBG="{Binding Source={StaticResource theBG}}" /> 
    
  • usercontrol.xaml.cs

    public SolidColorBrush buttonBG 
    { 
        get { return base.GetValue(buttonBGProperty) as SolidColorBrush; } 
        set { base.SetValue(buttonBGProperty, value); } 
    } 
    public static readonly DependencyProperty buttonBGProperty = DependencyProperty.Register("buttonBG", typeof(SolidColorBrush), typeof(DataPanel), null); 
    
  • usercontrol.xaml

    <Button ... Background="{Binding buttonBG}"> 
    

Я ожидал, что это сработает, но фон не тот, который я установил в ресурсе окна.

Что я делаю неправильно?

+1

Вы можете упростить 'buttonBG =" {Binding Source = {StaticResource theBG}} "' to 'buttonBG =" {StaticResource theBG} "', привязка ничего не делает. –

+1

'SolidColorBrush' в излишне специфическом, просто использовал бы« Brush »как тип свойства. –

ответ

1
Background="{Binding buttonBG}" 

Подразумевается, что либо вы изменили DataContext в UserControl, который вы should never do. Или что привязка просто неверна.

Использование

Background="{Binding buttonBG, ElementName=control}" 

Называя свой UserControl корневой элемент control. RelativeSource также работает.

+0

Настройка ElementName работала для меня. Спасибо. –

+0

может ли это быть реализовано без использования DependencyProperties? –

+0

Да, но тогда вы освобождаете привязку. Свойства в UserControls обычно должны быть свойствами зависимостей, чтобы разрешить все варианты использования. –

1

Попробуйте поместить его в отдельную модель или даже в viewmodel с INotifyPropertyChanged. Когда вы добавляете код представления в cs для файла xaml, вам нужно связать с selfource self и его хаки и идти против MVVM. Я бы создал отдельную ViewModel с кистью, в которой был обработан NotifyPropertyChanged. Это скажет, что пользовательский интерфейс изменит все, что связано с изменением стоимости.

В окне привяжите ваш viewmodel к datacontext. В ViewModel можно поставить:

private Brush _bgColor; 
    public Brush BgColor 
    { 
     get{return _bgColor; 
    } 
    set 
    { 
    _bgColor = value; 
    OnPropertyChanged("BgColor"); 
    } 

Создание ICommand и связать свою кнопку к нему, как это в ViewModel:

ICommand ChangeBgColor {get;set; 

И в XAML для кнопки:

Command="{Binding Path=DataContext.ChangeBgColor,RelativeSource={RelativeSorce Mode=FindAncestor,AncestorType={x:Type UserControl}}" 

Это запустит ICommand, привязанный к viewmodel, который является datacontex окна, с которым вы работаете.

И в этом коде для изменения ICommand из ваших цветов, вы можете сделать это следующим образом:

private void OnChangeBgColor(object param){ 
var bc = new BrushConverter(); 
BgColor = (Brush)bc.ConvertFrom("#fff"); 
} 

с шаблоном MVVM, вы хотите, чтобы уйти от сдачи ненужного кода в файлах xaml.cs и начать вводить их в viewmodels и модели.

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