У меня есть пользовательская реализация 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
, но я пока не уверен, как это сделать.
Любой совет приветствуется. Спасибо!