Связывание WPF на основе сравнения - PullRequest
3 голосов
/ 07 января 2010

Есть относительно простая вещь, которую я пытаюсь достичь, но я не уверен, как это сделать. По сути, у меня есть класс CLR следующим образом:

class SomeClass
{
    public SomeEnum Status;
}

public enum SomeEnum { One, Two, Three };

У меня есть DataGrid, который я связываю ObservableCollection<SomeClass> программно через код. В этой DataGrid у меня есть DataGridTemplateColumn, содержащий две кнопки, как показано ниже:

<toolkit:DataGridTemplateColumn Header="Actions">
    <toolkit:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Button Content="ActionOne" />
        <Button Content="ActionTwo" />
    </StackPanel>
    </DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

Что я хочу сделать, так это связать свойство IsEnabled этих кнопок со сравнением, основанным на значении {Binding Path = Status}. Например, в псевдокоде:

ActionOne.IsEnabled = BoundValue.Status != SomeEnum.Two
ActionTwo.IsEnabled = BoundValue.Status == SomeEnum.One || BoundValue.Status == SomeEnum.Two

Есть ли способ сделать это в XAML? В качестве альтернативы можно было бы просто написать конвертер значений для каждой кнопки, но, поскольку содержимое и другие детали кнопки также могут различаться, я не хочу в конечном итоге писать как 6 конвертеров значений.

Ура!

Ответы [ 2 ]

4 голосов
/ 07 января 2010

Почему бы не предоставить дополнительные свойства в SomeClass, который выполняет логику сравнения?

например:

public bool ActionOneEnabled
{
    get { return Status != SomeEnum.Two; }
}

Затем вы можете легко привязать IsEnabled кнопки к соответствующему свойству.

Не забудьте включить OnPropertyChanged ("ActionOneEnabled") в свой установщик для Status - так, чтобы при изменении вашего Status ваши свойства, основанные на Status, переоценивались.

4 голосов
/ 07 января 2010

Вы можете сделать это, используя DataTrigger в сочетании с конвертером, как показано ниже. Однако преимущество решения Брайана состоит в том, что он не использует несколько конвертеров, и, похоже, это было одной из ваших проблем, поэтому его ответ может быть лучше для вашего сценария.

<Button>
    ....
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="IsEnabled" Value="False" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Status, Converter={StaticResource yourConverter}}" Value="True">
                    <Setter Property="IsEnabled" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>

Другой вариант - не использовать DataTrigger и не добавлять привязку непосредственно в свойство IsEnabled:

<Button  
    IsEnabled="{Binding Path=Status, Converter={StaticResource yourConverter}}"  
    ...  
/> 
...