2016-06-30 2 views
0

У меня есть следующий код XAML:Binding ошибки в скрытой панели инструментов

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

и два класс, как это возможно контекст данных - для двух разных окон.

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

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

Скрыть toolbartray из примера, когда он мне не нужен. Но даже если SomeProperty установлен на Visibility.Collapsed, я все еще получаю ошибки привязки для опции IsEnabled, когда я использую ToolbarContextOne в качестве контекста данных. Я подозреваю, что это происходит, потому что это то, как работает парсер. Но, может быть, есть способ избежать этой проблемы без изменения классов контекстов данных?

+0

что сообщение об ошибке? –

ответ

0

Является ли такая обязательная ошибка столь важной, за исключением разработчика?

Ошибка привязки отображается только в окне вывода отладки, не так ли?

Пользователь не может видеть панель инструментов в конце концов.

Если ошибка действительно раздражает, вы можете:

1 Обеспечить ToolbarContextTwo для DataContext.

-Добавить свойство IsEnbled в ToolbarContextOne

С уважением

+0

Конечно, я могу, я знаю, как исправить проблему с рефакторингом контекста. Я хочу избежать этого. –

+0

Извините, что у меня есть «закрытый» ответ, но я хочу ответить на ваш вопрос, и я думаю, что другого пути нет –

0

Самым простым способом избежать связывания ошибок является использование FallbackValue в связывании:

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

Обновлено
Другим способом включить привязку, только если DataContext имеет определенное свойство:

<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> 

и конвертер:

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(); 
    } 
} 
Смежные вопросы