Encuadernación de un STYLE DATATERGERS a una propiedad de estado personalizada de Icommand -- wpf campo con xaml campo con binding camp Relacionados El problema

Binding a Style DataTrigger to a custom ICommand's status property


1
vote

problema

Español

Tengo una implementación personalizada del ICommand , que ejecuta sus enlaces en un BackgroundWorker , para que la interfaz de usuario permanezca responsiva.

Me gustaría mostrar un efecto personalizado mientras se ejecutan los enlaces. Por ahora, el efecto se simplifica para configurar la propiedad IsExecuting222 IsExecuting2 de la fuente de comando a False . Más tarde, nuestro diseñador se encontrará con una buena animación de estilo progresivo.

Aquí hay un ejemplo de lo que estoy tratando de hacer, que funciona (tipo de):

  <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>   

Como evidente, mi ICommand contiene una propiedad IsExecuting6 , que se establece en True Mientras BackgroundWorker hace es algo con los enlaces, por lo tanto, deshabilitando el botón en la UI.

Desafortunadamente, tener que establecer explícitamente el IsExecuting69 a la instancia de comando, me impide referirse al IsExecuting10 en casos como este:

  BackgroundWorker111  

Aquí, el BackgroundWorker2 debe enlazar al BackgroundWorker313 (que se configura en una instancia de mi modelo de vista), pero en su lugar se une al comando que sabe Nada sobre BackgroundWorker4 .

Probablemente haya más formas de resolver esto, y estoy interesado en escucharlos a todos ellos. Yo mismo he estado pensando en la línea de usar una propiedad adjunta para reemplazar la obligación directa al IsExecuting15 y con él la necesidad de configurar el BackgroundWorker6 , pero no estoy pero seguro de cómo hacer eso.

Cualquier consejo es lo más bienvenido. ¡Gracias!

Original en ingles

I have a custom implementation of WPF's ICommand, that executes its bindings in a BackgroundWorker, so that the UI stays responsive.

I would like to display a custom effect while the bindings are being executed. For now, the effect is simplified to setting command source's IsEnabled property to False. Later, our designer will come up with some nice progress-style animation.

Here's an example of what I'm trying to do, that works (sort of):

<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> 

As evident, my ICommand contains an IsExecuting property, which is set to True while the BackgroundWorker does its thing with the bindings, consequently disabling the button in the UI.

Unfortunately, having to explicitly set the button's DataContext to command instance prevents me from referring to the original DataContext in cases like this one:

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

Here, the CommandParameter should bind to the window's DataContext (which is set to an instance of my view-model), but instead it binds to the command which knows nothing about SelectedItem.

There are probably more ways to solve this, and I'm interested to hear all of them. I myself have been thinking along the lines of using an attached property to replace the direct binding to command's IsExecute and with it the need for setting the DataContext, but I'm not yet sure how to do that.

Any advice is most welcome. Thank you!

        

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Por ahora, he ideado esta solución simple:

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

Hace lo que quería, así que estoy feliz. Si alguien piensa que hay una mejor manera, todavía estoy interesado, aunque.

 

For now, I've come up with this simple solution:

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

It does what I wanted so I'm happy. If anyone thinks there's a better way, I'm still interested, though.

 
 

Relacionados problema

4  Enlace dinámicamente el argumento y el valor predeterminado a la función existente en JavaScript  ( Dynamically bind argument and default value to existing function in javascript ) 
Supongamos que tiene alguna función SOMFUN () ya definida en JavaScript, que puede o no tener su propio conjunto de argumentos definido. ¿Es posible escribi...

0  La propiedad de encuadernación a la caja de la caja de texto falla en la versión beta de Microsoft AJAX Client Templates Beta  ( Binding to text box value property fails in microsoft ajax client templates beta ) 
El siguiente código debe enlazar la propiedad "Valor" del cuadro de texto a la cadena "Prueba". En su lugar, la expresión de enlace "{{prueba}}" se dejó lib...

16  ItesControl ItemTemplate Binding  ( Itemscontrol itemtemplate binding ) 
En WPF4.0, tengo una clase que contiene otros tipos de clase como propiedades (combinando múltiples tipos de datos para mostrar). Algo así como: public par...

6  ¿Cómo manejar los enlaces de datos relacionados?  ( How to handle data bindings that are related ) 
A menudo me encuentro con problemas en los que se actualizan dos valores (relacionados) de un control, y ambos desencadenarían una operación costosa, ni posib...

9  Encabezados de columna personalizados de unión de DataGrid WPF  ( Wpf datagrid binding custom column headers ) 
Estoy tratando de averiguar cómo vincular a un encabezado de columna y datos principales de un WPF DataGrid a un origen de datos utilizando un patrón MVVM. El...

0  Control de datos de datos WPF, detectó el cambio de tabla SQL  ( Wpf data bound control detect sql table change ) 
Estoy teniendo un momento de estupidez. Tengo un control de TreeView en WPF, que muestra una lista de cotizaciones, es decir, Número de cotización, nombre d...

1  Databinding para uno mismo sin código  ( Databinding to self without code ) 
Estoy construyendo un UserControl en WPF. El control tiene dos propiedades, título y descripción, que me gustaría enlazar a dos bloques de texto. Parece real ...

1  Binding Z3 Ocaml no funciona (Windows 7)  ( Z3 ocaml binding not working windows 7 ) 
No estoy obteniendo la vinculación de Z3 Ocaml trabajando en Windows 7. Aquí está el proceso que seguí. OBJETIVO INSTALADO CAML VERSIÓN 3.11.0 (Microsoft T...

9  ¿Hay alguna manera de cambiar globalmente los comportamientos predeterminados de los enlaces en WPF?  ( Is there a way to globally change the default behaviors of bindings in wpf ) 
¿Hay alguna manera de cambiar el comportamiento predeterminado de los enlaces, por lo que no necesito configurar 'UpDATESOURCETRIGHT = RUITCHCHANGED' en cada ...

3  WPF Encuadernación a un combo utilizando solo un subconjunto de artículos de una colección  ( Wpf binding to a combo using only a subset of a collections items ) 
Estoy tratando de establecer una encuadernación de twoway a un cuadro combinado con solo una selección de los objetos de una colección. Actualmente, todo func...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos