2017-02-20 1 views
0

Ich habe mehrere benutzerdefinierte Steuerelemente, die von DockPanel, ToggleButton, ComboBox usw. abgeleitet sind. Ich habe eine Klasse Props, die ich als Abhängigkeitseigenschaft in jeder dieser abgeleiteten Klassen verwenden möchte. Alle diese Klassen müssen die gleichen Abhängigkeitseigenschaften (enthalten in Props) und möglicherweise mehrere eigene einzigartige Eigenschaften (z. B. nur im Dock-Panel) haben. Ein Beispiel für einen Anwendungsfall sind die Eigenschaften ExistsInConfig und RightVisible. Ich möchte, dass das Steuerelement nur sichtbar ist, wenn beide auf "True" gesetzt sind. Diese Logik sollte in allen benutzerdefinierten Steuerelementen verfügbar sein.Bindung an verschachtelte Abhängigkeitseigenschaften des benutzerdefinierten Steuerelements

DockPanel.cs:

public class DockPanel : System.Windows.Controls.DockPanel 
{ 
    public DockPanel() 
    { 
     Props = new Props(); 
    } 

    public Props Props 
    { 
     get 
     { 
      return (Props)GetValue(Properties); 
     } 
     set 
     { 
      SetValue(Properties, value); 
     } 
    } 

    public static readonly DependencyProperty Properties = 
    DependencyProperty.Register("Props", typeof(Props), typeof(DockPanel), new PropertyMetadata(null)); 
} 

Props.cs:

public class Props: DependencyObject 
{ 
    public Props(){} 

    public bool RightVisible { get; set;} 

    public bool ExistsInConfig { get; set; } 

    public static readonly DependencyProperty RightVisibleProperty = 
    DependencyProperty.Register("RightVisible", typeof(bool), typeof(Props), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public static readonly DependencyProperty ExistsInConfigProperty = 
    DependencyProperty.Register("ExistsInConfig", typeof(bool), typeof(Props), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public static bool GetExistsInConfig(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(ExistsInConfigProperty); 
    } 

    public static void SetExistsInConfig(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ExistsInConfigProperty, value); 
    } 

    public static bool GetRightVisible(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(RightVisibleProperty); 
    } 

    public static void SetRightVisible(DependencyObject obj, bool value) 
    { 
     obj.SetValue(RightVisibleProperty, value); 
    } 
} 

Stil für DockPanel:

<Style x:Key="CustomDockPanelStyle" TargetType="custom:DockPanel"> 
    <Setter Property="Visibility"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource MultipleBooleanToVisibilityConverter}"> 
       <Binding RelativeSource="{RelativeSource Self}" Path="Props.ExistsInConfig" NotifyOnSourceUpdated="True" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged"/> 
       <Binding RelativeSource="{RelativeSource Self}" Path="Props.RightVisible" NotifyOnSourceUpdated="True" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 

das Steuerelement in XAML verwenden:

<Window.Resources> 
    <Style TargetType="{x:Type custom:DockPanel}" BasedOn={StaticResource CustomDockPanelStyle}" 
</Window.Resources> 

<custom:DockPanel 
custom:Props.ExistsInConfig="{Binding ElementName=ToggleCombinedVisibility, Path=IsChecked, Mode=OneWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
custom:Props.RightVisible="{Binding ElementName=ToggleCombinedVisibility, Path=IsChecked, Mode=OneWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 

<ToggleButton x:Name="ToggleCombinedVisibility" IsChecked="True" /> 

Das Problem ist, die Bindung funktioniert nicht. Die MultipleBooleanToVisibilityConverter wird nur beim Laden der Ansicht aufgerufen und nicht wenn ich versuche, die Sichtbarkeit mit einer Schaltfläche umzuschalten. Wenn ich Callbacks in PropertyMetadata von RightVisible und ExistsInConfig angeben, werden sie nach dem Umschalten der Schaltfläche aufgerufen, aber der Konverter nicht.

Muss ich lassen DockPanel wissen, dass Props hat sich geändert? Wie gehe ich da vor? Ich konnte keinen Weg finden, INotifyPropertyChanged über zwei Klassen zu implementieren.

+0

Würden die downvoters kümmern bitte erklären? – gingergenius

Antwort

0

Die Bindungspfade in Ihrem Style sind falsch.

Angehängte Eigenschaften sollten durch eingeschlossene Klammern und benutzerdefinierte angefügte Eigenschaften mit einem Namespace-Alias ​​versehen sein.

sollte diese Arbeit:

<Style x:Key="CustomDockPanelStyle" TargetType="custom:DockPanel"> 
    <Setter Property="Visibility"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource MultipleBooleanToVisibilityConverter}"> 
       <Binding RelativeSource="{RelativeSource Self}" Path="(custom:Props.ExistsInConfig)" NotifyOnSourceUpdated="True" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged"/> 
       <Binding RelativeSource="{RelativeSource Self}" Path="(custom:Props.RightVisible)" NotifyOnSourceUpdated="True" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 
Verwandte Themen