2010-05-26 2 views
9

Я хочу привязать кнопки IsEnabled к состоянию, подобному myObject.SelectedIndex >= 0. Есть ли простой способ сделать это в xaml (без необходимости делать сумасшедшие вещи для любых базовых объектов)? Я действительно не видел хороший пример.WPF Условное связывание. Button.IsEnabled to SelectedIndex> = 0

Честно говоря, я хочу, чтобы это было так же просто, как Flex 3 ... т.е .:

<mx:Button enabled="{dataGrid.SelectedIndex >= 0}" ... 

ответ

16

SelectedIndex будет -1, если не выделен, ничего, не так ли? Реверс логику и использовать триггер:

<Button ...> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="enabled" Value="True" /> 

      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding SelectedIndex,ElementName=dataGrid}" 
        Value="-1"> 

        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Button.Style> 
<Button> 
+0

Спасибо, я могу использовать это для одной из моих кнопок, но другой будет где SelectedIndex> = 1. Могу ли я сделать это, как ваш пример выше, но только с помощью MultiDataTrigger? –

+1

MultiDataTrigger используется, когда условия выполняются вместе. Чтобы сделать SelectedIndex> = 1 скопируйте datatrigger для '-1' и измените значение триггера на '0'. –

2

я не нашел особенно простой в использовании способ вставлять выражение в XAML, так вот что я использую вместо этого:

BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
    new Binding { Source = myObject, 
        Path = new PropertyPath(ComboBox.SelectedIndexProperty) }, 
    (int selectedIndex) => selectedIndex >= 0 
)); 

Вам нужно написать это на C#, например, в конструкторе окна.

Это также работает легко для мульти-источников привязок:

BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
    new Binding { Source = myObject, 
        Path = new PropertyPath(ComboBox.SelectedIndexProperty) }, 
    new Binding { Source = myObject2, 
        Path = new PropertyPath(Button.ActualHeightProperty) }, 
    (int selectedIndex, double height) => selectedIndex >= 0 && height > 10.5 
)); 

Заметим, что лямбда статически типизированных, и любые ошибки типа являются (относительно) шумным, помогая отслеживать их вниз. Также учитывается тип возврата лямбда; вы можете использовать это, чтобы привязать ширину одного объекта к сложной формуле на основе ширины другого ...

Этот класс LambdaBinding не является встроенным; вы должны указать файл .

Сторона примечания. Настоящий позор, который XAML не допускает выражений. Да, я понимаю, что XAML должен быть «для дизайнеров» и без этой неуловимой вещи мы называем прикладной логикой, но кого мы здесь шутим ... Во-первых, DataTrigger, показанный в другом ответе, в основном условное выражение, и поэтому ничего другого (только намного больше), чем {Binding source.SelectedIndex >= 0}. Во-вторых, если идея является простотой, тогда выражения привязки, которые должен иметь дизайнер, которые могут писать, намного превосходят возможности не-программиста ... если вам нужны доказательства, подумайте над чем-то вроде этого:

Смежные вопросы