2016-06-23 16 views
0

Ich versuche, ein WPF UserControl zu erstellen, das 2 Schaltflächen enthält. Ich verwende dieses UserControl in einem Fenster und wende einen Window.Resource-Wert an, um den Hintergrund einer Schaltfläche innerhalb des Benutzersteuerelements festzulegen.WPF UserControl Eigenschaft Bindung

Zur Zeit habe ich:

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

Ich habe erwartet, dass dies funktioniert, aber der Hintergrund ist nicht der, den ich im Fenster Ressource festgelegt.

Was mache ich falsch?

+1

Sie können 'buttonBG =" {Binding Source = {StaticResource theBG}} "' zu 'buttonBG =" {StaticResource theBG} "' vereinfachen, die Bindung tut nichts. –

+1

'SolidColorBrush' in unnötig spezifischen, würde nur' Brush' als Eigenschaftstyp verwenden. –

Antwort

1
Background="{Binding buttonBG}" 

Impliziert entweder, dass Sie die DataContext des UserControl geändert, die Sie should never do. Oder dass die Bindung einfach falsch ist.

Verwenden

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

Benennen UserControl Wurzelelement control. RelativeSource funktioniert auch.

+0

Einstellung Elementname arbeitete für mich. Vielen Dank. –

+0

könnte dies ohne die Verwendung von DependencyProperties implementiert werden? –

+0

Ja, aber dann verlieren Sie die verbindliche Unterstützung. Eigenschaften auf UserControls sollten normalerweise Abhängigkeitseigenschaften sein, um jeden Anwendungsfall zuzulassen. –

1

Versuchen Sie es in einem separaten Modell oder sogar einem Ansichtsmodell mit INotifyPropertyChanged zu platzieren. Wenn Sie View-Code in der CS für eine XAML-Datei hinzufügen, müssen Sie sich mit Verwandten selbst und dessen Hacky binden und gegen MVVM gehen. Ich würde ein separates ViewModel mit einem Pinsel erstellen, in den NotifyPropertyChanged eingebacken ist. Dies wird der Benutzeroberfläche mitteilen, alles zu ändern, an das sie bei einer Wertänderung gebunden ist.

Im Fenster binden Sie Ihr Viewmodel an datacontext. Im Ansichtsmodell können Sie setzen:

private Brush _bgColor; 
    public Brush BgColor 
    { 
     get{return _bgColor; 
    } 
    set 
    { 
    _bgColor = value; 
    OnPropertyChanged("BgColor"); 
    } 

eine ICommand erstellen und binden Sie Ihre Taste, um es so in dem Viewmodel:

ICommand ChangeBgColor {get;set; 

Und in der XAML für den Button:

Command="{Binding Path=DataContext.ChangeBgColor,RelativeSource={RelativeSorce Mode=FindAncestor,AncestorType={x:Type UserControl}}" 

Dadurch wird der ICommand ausgelöst, der an das Ansichtsmodell gebunden ist, das der Datencontex des Fensters ist, mit dem Sie arbeiten.

Und in diesem Code für die ICommand ändern Sie Ihre Farben, können Sie es so machen könnte:

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

Mit dem MVVM Muster, möchten Sie davon ab, unnötige Code in den xaml.cs Dateien wegzukommen und fange an, sie in Viewmodels und Modelle zu bringen.

Verwandte Themen