2017-10-17 10 views
0

UserControlに依存プロパティがあり、SelectedColorというプロパティがあります。View Modelから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;。それは、メインのアプリケーションで、このユーザーコントロールのインスタンスのための全く新しいコンテキストを作成することを宣言し、したがって、ビューモデルから送信された値は再初期化されるのは間違いありませんか?もしそうなら、どうやって再宣言しなくても値を送ることができますか? 行が必要な場合は、UserControl内の一部の機能が動作しなくなります。

誰もこれまでに遭遇したことはありますか?

ありがとうございます!

+0

'this.DataContext =この;'の癌でありますWPF MVVM。 [この記事ではその理由を説明します(http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html)。あなたはそれがちょっと長いことに気づくでしょうが、化学療法もそうです。 – Will

答えて

0

DataContext = thisは、UserControlDataContextをそれ自身に設定します。あなたはこれをしたくありません。代わりに、あなたはDataContextプロパティを設定せずに{RelativeSource}を使用してUserControlのプロパティにバインドすることができます:

<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

これはcharm @ mm8のように機能します!ありがとう! –

+0

私はRelativeSourceの代わりにElementNameを使うのが好きです... – Will

関連する問題