2017-10-17 164 views
0

我在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

回答

0

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

相關問題