我正在尝试创建一个包含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}">
我希望这可行,但背景不是我在窗口资源中设置的背景。
我做错了什么?
答案 0 :(得分:1)
Background="{Binding buttonBG}"
表示您更改了DataContext
的{{1}},即should never do。或者说绑定是错误的。
使用
UserControl
命名您的Background="{Binding buttonBG, ElementName=control}"
根元素UserControl
。 control
也适用。
答案 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文件中放置不必要的代码并开始将它们放入视图模型和模型中。