2010-02-10 11 views
11

He escrito un MultiValueConverter que comprueba si una lista determinada contiene un valor determinado y devuelve verdadero si lo hace. Lo uso para enlazar a la lista de casillas personalizadas. Ahora me gustaría escribir el método ConvertBack para que, si la casilla de verificación estuviera marcada, el valor original se envíe al modelo. ¿Hay alguna manera de acceder a los valores en el método ConvertBack?WPF: ¿Hay alguna forma de obtener valores originales en el método ConvertBack de MultiValueConverter?

XAML:

<ListBox.ItemTemplate> 
    <HierarchicalDataTemplate> 
     <CheckBox Content="{Binding Path=Description}"> 
      <CheckBox.IsChecked> 
       <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}"> 
        <Binding Path="Id" /> 
        <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
       </MultiBinding> 
      </CheckBox.IsChecked> 
     </CheckBox> 
    </HierarchicalDataTemplate> 
</ListBox.ItemTemplate> 

consigo resultados correctos cuando estoy vinculante, pero hay una manera de obtener el ID enlazado al convertir de vuelta? Lo que me gustaría lograr es que si la casilla de verificación está desmarcada, el valor se eliminará de la lista y, si está marcada, el valor se agregará a la lista.

+0

tengo un problema similar donde uno de mis enlaces en el multibinding es un objeto con una lista de objetos que contienen un campo de texto. el multibinding está ligado a una de las cajas de texto basadas en el otro valor de enlace. Necesito el cuadro de texto para cambiar el texto del objeto en convertBack, pero todo lo que tengo es el nuevo valor, y no el texto del objeto que necesita cambiar – JoeSharp

Respuesta

5

He resuelto mi problema, y ​​espero que la solución también te ayude. Tome la multibinding que tiene, y en lugar de ponerlo en el atributo IsChecked, póngalo en el atributo DataContext. Puede ser que nuestros problemas difieran ... en mi método de conversión, estaba usando los datos en los enlaces para tomar un objeto, y luego devolví myobject.text. Cambié esto para devolver solo el objeto, de modo que se vincule al contexto de datos. A continuación, vinculé la propiedad textbox.text a la propiedad de texto de myobject. Parece que funciona bien. A continuación, podría vincular la lista donde se eliminan los valores de la casilla de verificación. Se verificó ... Supongo. No estoy exactamente seguro de lo que estás tratando de hacer.

Estoy pensando que esto podría obtener en el camino correcto ...

<ListBox.ItemTemplate> 
<HierarchicalDataTemplate> 
    <CheckBox Content="{Binding Path=Description}"> 
     <CheckBox.DataContext> 
      <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}"> 
       <Binding Path="Id" /> 
       <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
      </MultiBinding> 
     </CheckBox.DataContext> 
     <CheckBox.IsChecked> 
      <Binding Path="Some_Property_For_IsChecked_In_Some_Object_In_The_Converter" /> 
     </CheckBox.IsChecked> 
    </CheckBox> 
</HierarchicalDataTemplate> 

6

Sé que esto es una cuestión de edad, pero esta solución podría ayudar a alguien más.

lugar de utilizar el método de la IMultiValueConverterConvertBack, puede establecer la IsChecked vinculante que se OneWay y usar la propiedad CheckBoxCommand para realizar la lógica de verificación.

<ListBox.ItemTemplate> 
    <HierarchicalDataTemplate> 
     <CheckBox Content="{Binding Path=.}" Command="{Binding Path=CheckBoxCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding Path=.}"> 
      <CheckBox.IsChecked> 
       <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}" Mode="OneWay"> 
        <Binding Path="." /> 
        <Binding Path="SelectedItems" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
       </MultiBinding> 
      </CheckBox.IsChecked> 
     </CheckBox> 
    </HierarchicalDataTemplate> 
</ListBox.ItemTemplate> 

A continuación, añadir el CheckBoxCommand que realiza algo similar a esto:

// the items bound to your checkbox 
    public Collection<string> Items { get; set; } 

    // the list of selected items 
    public Collection<string> SelectedItems { get; set; } 

    private void ExecuteCheckBoxCommand(string obj) 
    { 
     SelectedItems.Add(obj); 
    } 

Sé que es un sobre de ida y forma un poco de hacer esto, pero el método IMultiValueConverter.ConvertBack es realmente bastante inútil - No puedo Pienso en demasiados usos sin tener acceso a los valores de enlace actuales.

+3

Gracias por este enfoque, que funcionó para mí. Me tomó un tiempo darme cuenta de que ConvertBack es completamente inútil. Deberían poner eso en la documentación y salvarnos a todos por algún tiempo. – Jan

+0

Yup totalmente inútil :( – Asheh

Cuestiones relacionadas