2013-07-09 3 views
0

У меня есть интерфейс с несколькими кнопками. Я бы хотел включить или отключить эти кнопки в соответствии с «сложным» состоянием. Я объявил это MultiBinding как ресурс приложения для того, чтобы избежать повторения кода:Связать свойство с существующим привязкой

<MultiBinding x:Key="MyMultiBinding" Converter="{StaticResource ResourceKey=MyConverter}"> 
    <Binding Path="IsConnected" /> 
    <Binding Path="IsOpened" /> 
</MultiBinding> 

Вот как я объявляю мою кнопку:

<Button Name="MyButton" Content="Click me!" IsEnabled="{StaticResource ResourceKey=MyMultiBinding}" /> 

Во время выполнения я получаю следующее сообщение об ошибке: «Установить свойство IsEnabled бросил исключение ... MultiBinding не является допустимым значением для свойства IsEnabled ".

Не могу понять, почему это не работает. Не могли бы вы указать мне правильный способ сделать это? Спасибо.

+0

Не уверен, что если ' MultiBinding' даже разрешен как ресурс. Я даже не могу его скомпилировать. «A MultiBinding» не может быть задано в свойстве «Значение» типа «DictionaryEntry». «MultiBinding» может быть установлен только в DependencyProperty объекта DependencyObject. «Самый простой способ состоит в том, чтобы действительно превратить его в« стиль »и сделать ваше свойство. Связывание там и применить этот стиль к вашему элементу управления либо с помощью определенного ключа или сделать его неявным. [Пример] (http://stackoverflow.com/a/14970686/1834662) – Viv

+0

В качестве ресурса разрешено использование MultiBinding. Я могу добавить его в Application.Resources без каких-либо проблем. Во всяком случае, я превратил его в стиль, и это работает. Спасибо! –

ответ

0

Вы не можете установить логическое свойство IsEnabled к значению типа MultiBinding. Это то, что происходит.

Как @Viv отметил, вы можете объявить Style делать тяжелую работу:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="IsEnabled"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource ResourceKey=MyConverter}"> 
       <Binding Path="IsConnected" /> 
       <Binding Path="IsOpened" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Button Name="MyButton" Content="Click me!" Style="{StaticResource ButtonStyle}" /> 

Это хорошо работает, если ButtonDataContext обладает этими свойствами. Он работает особенно хорошо, если у каждого из них есть разные DataContext, с которыми они связаны, что позволяет им по разным причинам.

Если все они связаны с тем же DataContext или свойства находятся на другом объекте, вы можете использовать Freezable Trick, чтобы обеспечить значение, что ваши кнопки будет связываться с:

<BindingProxy x:Key="isEnabled"> 
    <BindingProxy.Data> 
     <MultiBinding Converter="{StaticResource ResourceKey=MyConverter}"> 
      <Binding Path="IsConnected" /> 
      <Binding Path="IsOpened" /> 
     </MultiBinding> 
    </BindingProxy.Data> 
</BindingProxy> 

<Button Name="MyButton" Content="Click me!" IsEnabled="{Binding Data, Source={StaticResource isEnabled}}" /> 
0

Я не знаю, является ли это лучшим решением, но обертывание MultiBinding в стиле, как сказал Viv, сделал трюк. Вот код стиля:

<Style x:Key="MyStyle" TargetType="Button"> 
    <Style.Setters> 
     <Setter Property="IsEnabled"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource ResourceKey=MyConverter}"> 
        <Binding Path="IsConnected" /> 
        <Binding Path="IsDataAccessOpened" /> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 

И код кнопки:

<Button Name="MyButton" Content="Click me!" Style={StaticResource ResourceKey=MyStyle} />