WPF UserControl属性绑定

时间:2016-06-23 13:46:07

标签: c# wpf xaml

我正在尝试创建一个包含2个按钮的WPF UserControl。我在Window中使用此UserControl并应用Window.Resource值来设置用户控件中一个按钮的背景。

目前我有:

  • 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}">
    

我希望这可行,但背景不是我在窗口资源中设置的背景。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

Background="{Binding buttonBG}"

表示您更改了DataContext的{​​{1}},即should never do。或者说绑定是错误的。

使用

UserControl

命名您的Background="{Binding buttonBG, ElementName=control}" 根元素UserControlcontrol也适用。

答案 1 :(得分:1)

尝试将其放在单独的模型中,甚至是具有INotifyPropertyChanged的视图模型。当您在cs中为xaml文件添加视图代码时,您需要使用relativesource self和hacky绑定并且违反MVVM。我会创建一个单独的ViewModel与一个将NotifyPropertyChanged烘焙到其中的Brush。这将告诉UI更改其在值更改时绑定的所有内容。

在Window中,将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文件中放置不必要的代码并开始将它们放入视图模型和模型中。