将视图模型的值发送到UserControl相关属性WPF
我在UserControl
中拥有一个依赖属性,其属性名为SelectedColor
。从我的主要的应用程序,使用此我的代码窗口的看法是:将视图模型的值发送到UserControl相关属性WPF
<controls:ColorPicker SelectedColor="{Binding MyCanvas.CanvasBackgroundColor}" />
而且从视图模型的代码是:
public MyCanvas { get; set; }
public MyWindowViewModel(MyCanvas myCanvas)
{
MyCanvas = myCanvas;
}
然后为我的用户的XAML是:
<UserControl . . .>
<Button Click="Button_Click">
<Button.Style>
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{Binding SelectedColor}" BorderBrush="Black" BorderThickness="1" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
</UserControl>
和代码隐藏:
public ColorPicker()
{
InitializeComponent();
DataContext = this;
}
public SolidColorBrush SelectedColor
{
get { return (SolidColorBrush)GetValue(SelectedColorProperty); }
set { SetValue(SelectedColorProperty, value); }
}
public static readonly DependencyProperty SelectedColorProperty =
DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null));
我认为问题可能与代码隐藏DataContext = this;
中的行有关。是否正确的是,声明这为主应用中的此用户控件的实例创建了一个全新的上下文,因此从视图模型发送给它的任何值都将被重新初始化?如果是这样,我怎么能发送价值而不重新宣布?我还需要DataContext = this
一行,因为如果没有它,我的UserControl
中的某些功能将不再起作用。
有没有人遇到过这个?
在此先感谢!
DataContext = this
将UserControl
的DataContext
设置为自身。你不想这样做。相反,你可以结合使用{RelativeSource}
的UserControl
的属性没有设定DataContext
属性:
<Border Background="{Binding SelectedColor, RelativeSource={RelativeSource AncestorType=UserControl}}"
BorderBrush="Black" BorderThickness="1" />
代码隐藏:
public ColorPicker()
{
InitializeComponent();
}
public SolidColorBrush SelectedColor
{
get { return (SolidColorBrush)GetValue(SelectedColorProperty); }
set { SetValue(SelectedColorProperty, value); }
}
public static readonly DependencyProperty SelectedColorProperty =
DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null));
这就像一个魅力@ mm8!谢谢! –
我更喜欢使用ElementName而不是RelativeSource ... – Will
'this.DataContext =这一点;'是癌症WPF MVVM。 [这篇文章解释了为什么](http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-use-usercontrols-in-wpf-silverlight.html)。你会注意到它有点长,但化疗也是如此。 – Will