2010-01-07 3 views
3

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

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 преобразователей значений.

Cheers!

ответ

4

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

например:

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

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

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

+0

Да, это идиома MVVM. – itowlson

+0

Я играл с этим. Хотя он определенно работает и имеет наименьшее количество кода, в то же время он включает в себя информацию пользовательского интерфейса внутри моего объекта. Например, если я хочу, чтобы содержимое кнопки зависело от статуса, мне пришлось бы поместить эту информацию в мои свойства SomeClass, тогда как это должно быть где-то в классах View/XAML – sohum

+0

Если это вас беспокоит, тогда вам, вероятно, понадобится использовать предложенный мной метод конвертации. –

4

Вы можете сделать это с помощью 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}}" 
    ... 
/> 
Смежные вопросы