2010-02-10 9 views
11

Ich habe einen MultiValueConverter geschrieben, der prüft, ob eine gegebene Liste einen gegebenen Wert enthält und true zurückgibt, wenn dies der Fall ist. Ich verwende es zum Binden an benutzerdefinierte Checkbox-Liste. Jetzt möchte ich ConvertBack-Methode schreiben, so dass, wenn das Kontrollkästchen aktiviert war, der ursprüngliche Wert an das Modell gesendet würde. Gibt es eine Möglichkeit, auf Werte in der ConvertBack-Methode zuzugreifen?WPF: Gibt es eine Möglichkeit, Originalwerte in ConvertBack-Methode von MultiValueConverter zu erhalten?

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> 

ich korrekte Ergebnisse erhalten, wenn ich verbindlich, aber ist es eine Möglichkeit, um das gebundene ID zu erhalten, wenn die Umwandlung zurück? Was ich erreichen möchte, ist, dass, wenn das Kontrollkästchen deaktiviert ist, der Wert aus der Liste entfernt wird, und wenn er aktiviert ist, wird der Wert zur Liste hinzugefügt.

+0

Ich habe ein ähnliches Problem, wo eine meiner Bindungen in der Multibinderei ist ein Objekt mit einer Liste von Objekten, die ein Textfeld enthalten. Das Multibinding ist an einen der Textfelder gebunden, basierend auf dem anderen Bindungswert. Ich brauche das Textfeld, um den Text des Objekts auf convertBack zu ändern, aber alles, was ich habe, ist der neue Wert, und nicht was der Text des Objekts ändern muss – JoeSharp

Antwort

5

Ich habe mein Problem gelöst, und hoffentlich hilft Ihnen die Lösung auch. Nehmen Sie das Multibinding, das Sie haben, und setzen Sie es nicht in das IsChecked-Attribut, sondern in das DataContext-Attribut. Dies könnte der Punkt sein, an dem sich unsere Probleme unterscheiden ... Bei meiner Convert-Methode habe ich die Daten in den Bindungen verwendet, um ein Objekt zu erfassen, und dann habe ich myobject.text zurückgegeben. Ich habe das geändert, um nur das Objekt zurückzugeben, so dass es an den Datenkontext gebunden wird. Ich habe dann die Eigenschaft textbox.text an die Eigenschaft text von myobject gebunden. es scheint gut zu funktionieren. Sie könnten dann die Liste, wo Werte entfernt werden, an das checkbox.ischecked binden. Ich bin mir nicht ganz sicher, was du zu tun versuchst.

Ich denke, das könnte man auf dem richtigen Weg ...

<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

Ich weiß, dies ist ein altes Thema, aber diese Lösung könnte jemand anderes helfen.

Anstatt das die ConvertBack Methode der IMultiValueConverter zu verwenden, können Sie einstellen, die IsChecked Bindung OneWay zu sein und die CheckBoxCommand Eigenschaft verwenden, um das Kontrolllogik auszuführen.

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

Dann fügen Sie den CheckBoxCommand, die etwas ähnliches wie dies führt:

// 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); 
    } 

Ich weiß, es ist ein etwas Umwege, dies zu tun, aber die IMultiValueConverter.ConvertBack Methode ist wirklich ziemlich nutzlos - ich kann‘ Ich denke an zu viele Anwendungen dafür, ohne Zugriff auf die aktuellen Bindungswerte zu haben.

+3

Danke für diesen Ansatz, der für mich funktionierte. Ich brauchte einige Zeit um zu erkennen, dass ConvertBack völlig nutzlos ist. Sie sollten das in die Dokumentation schreiben und uns alle Zeit sparen. – Jan

+0

Yup total nutzlos :( – Asheh