2016-06-30 8 views
0

Ich habe nächsten XAML:Binding Fehler in versteckt Symbolleiste

<ToolbarTray Visibility="{Binding SomeProperty}"> 
    <Toolbar> 
     <Checkbox IsEnabled="{Binding IsEnabled}/" 
     <... other items /> 
    </Toolbar> 
</Toolbar> 

und zwei Klassen wie möglich Datenkontext - für zwei verschiedene Fenster.

class ToolbarContextOne 
{ 
    public Visibility SomeProperty {get;set;} 
} 

class ToolbarContextTwo:ToolbarContextOne 
{ 
    public bool IsEnabled {get;set;} 
} 

Ich ausblenden toolbartray aus Beispiel, wenn ich es nicht brauche. Aber selbst wenn SomeProperty auf Visibility.Collapsed gesetzt ist, erhalte ich immer noch verbindliche Fehler für die IsEnabled-Option, wenn ich ToolbarContextOne als Datenkontext verwende. Ich vermute, dass es passiert, weil Parser so funktioniert. Aber vielleicht gibt es eine Möglichkeit, dieses Problem zu vermeiden, ohne dass sich meine Datenkontextklassen ändern.

+0

, was die Fehlermeldung? –

Antwort

0

Ist dieser bindende Fehler so wichtig, außer für den Entwickler?

Der Bindungsfehler ist nur in den Debugging-Ausgabefenstern sichtbar, nicht wahr?

Der Benutzer kann den ToolBartay schließlich nicht sehen.

Wenn der Fehler wirklich ärgerlich ist, können Sie entweder:

1 eine ToolbarContextTwo für die Datacontext sorgen.

2 Fügen Sie die IsEnbled Eigenschaft ToolbarContextOne

Grüße

+0

Natürlich kann ich, ich weiß, wie man Problem mit Kontext Refactoring beheben. Ich möchte diesen Weg vermeiden. –

+0

Sorry, eine "geschlossene" Antwort zu haben, aber ich möchte deine Frage beantworten, und ich denke, dass es keinen anderen Weg gibt –

0

Der einfachste Weg, um die Bindungsfehler zu vermeiden ist FallbackValue zu verwenden, bei der Bindung:

<ToolbarTray Visibility="{Binding SomeProperty}"> 
    <Toolbar> 
     <Checkbox IsEnabled="{Binding IsEnabled, FallbackValue=False}/" 
     <... other items /> 
    </Toolbar> 
</Toolbar> 

wäre eine andere Art und Weise
Aktualisiert Um die Bindung nur zu aktivieren, wenn DataContext über eine bestimmte Eigenschaft verfügt:

<CheckBox> 
    <CheckBox.Resources> 
     <local:HasPropertyConverter x:Key="HasPropertyConverter"/> 
    </CheckBox.Resources> 
    <CheckBox.Style> 
     <Style TargetType="CheckBox"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=.,Converter={StaticResource HasPropertyConverter}, 
                 ConverterParameter=IsEnabled}" 
          Value="True"> 
        <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </CheckBox.Style> 
</CheckBox> 

und Konverter:

public class HasPropertyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return false; 
     } 

     if (parameter == null) 
     { 
      return false; 
     } 

     PropertyInfo property = value.GetType().GetProperty(parameter.ToString()); 
     return property != null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}