2016-06-23 11 views
0

2つのボタンを含むWPF UserControlを作成しようとしています。このUserControlをWindowで使用し、Window.Resource値を適用して、ユーザーコントロール内の1つのボタンの背景を設定します。現在WPF UserControlプロパティバインディング

私が持っている:

  • 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}"> 
    

これはうまくいくと思っていましたが、背景は私がウィンドウリソースに設定したものではありません。

私は間違っていますか?

+1

あなたは 'buttonBG =" {Binding Source = {StaticResource theBG}} "を' buttonBG = "{StaticResource theBG}" 'に単純化することができます。 –

+1

'SolidColorBrush'は不必要に特殊なもので、' Brush'をプロパティ型として使うだけです。 –

答えて

1
Background="{Binding buttonBG}" 

あなたはUserControlDataContext、あなたshould never doを変えどちらかということを意味します。または、バインディングが間違っていること。

使用

Background="{Binding buttonBG, ElementName=control}" 

あなたUserControlルート要素controlを命名。 RelativeSourceも同様に機能します。

+0

設定ElementNameは私のために働いた。ありがとうございました。 –

+0

これはDependencyPropertiesを使用せずに実装できますか? –

+0

はい、ただし、バインディングサポートが緩いです。 UserControlのプロパティは、通常、すべてのユースケースを許可するための依存プロパティです。 –

1

別のモデル、またはINotifyPropertyChangedを持つビューモデルに配置してみてください。 xamlファイルのcsにビューコードを追加する場合は、relativesourceのselfとそのハッキーをバインドして、MVVMと競合する必要があります。 NotifyPropertyChangedを焼き込んだ別のViewModelをブラシで作成します。これは、値の変更に関連するすべてのものを変更するようUIに指示します。

ウィンドウで、ビューモデルを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}}" 

これは、作業中のウィンドウのdatacontexであるviewmodelにバインドされたICommandを起動します。

とのICommandをコードで自分の色を出し変更、あなたはこのようにそれを行うことができます:MVVMパターンで

private void OnChangeBgColor(object param){ 
var bc = new BrushConverter(); 
BgColor = (Brush)bc.ConvertFrom("#fff"); 
} 

、あなたは離れてxaml.csファイルに不要なコードを入れてから取得したいですそれらをビューモデルとモデルに入れ始めます。

関連する問題