Привязка Style DataTrigger к пользовательскому свойству status ICommand - PullRequest
1 голос
/ 15 апреля 2010

У меня есть пользовательская реализация WPF ICommand, которая выполняет свои привязки в BackgroundWorker, так что пользовательский интерфейс остается отзывчивым.

Я хотел бы отобразить пользовательский эффект во время выполнения привязок. На данный момент эффект упрощен, если установить для свойства IsEnabled источника команды значение False. Позже наш дизайнер разработает хорошую анимацию в стиле прогресса.

Вот пример того, что я пытаюсь сделать, это работает (вроде):

<Button Width="80"
        Command="{x:Static Member=local:AppCommands.Test}"
        DataContext="{x:Static Member=local:AppCommands.Test}">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Setter Property="IsEnabled" Value="True"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsExecuting, Mode=OneWay}" Value="True">
          <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

Как видно, мой ICommand содержит свойство IsExecuting, которое установлено на True, в то время как BackgroundWorker выполняет свои функции с привязками, следовательно отключая кнопку в пользовательском интерфейсе.

К сожалению, необходимость явно установить DataContext кнопки для экземпляра команды не позволяет мне ссылаться на исходный DataContext в случаях, подобных этому:

<Button Width="80"
        Command="{x:Static Member=local:AppCommands.ParamTest}"
        CommandParameter="{Binding Path=SelectedItem}"
        DataContext="{x:Static Member=local:AppCommands.ParamTest}">

Здесь CommandParameter должен связываться с DataContext окна (которое установлено на экземпляр моей модели представления), но вместо этого он связывается с командой, которая ничего не знает о SelectedItem.

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

Любой совет приветствуется. Спасибо!

1 Ответ

0 голосов
/ 15 апреля 2010

Пока что я придумала это простое решение:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Command.IsExecuting, Mode=OneWay}" Value="True">

Оно делает то, что я хотел, поэтому я счастлив.Если кто-то думает, что есть лучший способ, мне все равно интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...