将视图模型的值发送到UserControl相关属性WPF

将视图模型的值发送到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中的某些功能将不再起作用。

有没有人遇到过这个?

在此先感谢!

+0

'this.DataContext =这一点;'是癌症WPF MVVM。 [这篇文章解释了为什么](http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-use-usercontrols-in-wpf-silverlight.html)。你会注意到它有点长,但化疗也是如此。 – Will

DataContext = thisUserControlDataContext设置为自身。你不想这样做。相反,你可以结合使用{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)); 
+0

这就像一个魅力@ mm8!谢谢! –

+0

我更喜欢使用ElementName而不是RelativeSource ... – Will