Laden...

[gelöst] Silverlight 5 - AutoCompleteBox.ValueMemberPath

Erstellt von ThomasE. vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.461 Views
T
ThomasE. Themenstarter:in
461 Beiträge seit 2013
vor 9 Jahren
[gelöst] Silverlight 5 - AutoCompleteBox.ValueMemberPath

Guten Tag,

ich stehe wieder vor einem neuen Problem und hoffe, daß mir wer weiterhelfen kann:

Es geht um die klassisch originale sdk:AutoCompleteBox unter Silverlight 5.


<sdk:AutoCompleteBox Grid.Column="2" Grid.Row="0" ValueMemberPath="MatchingValue"
                             Style="{StaticResource AutoCompleteBoxDefault}"
                             ItemsSource="{Binding Path=Fields[CoNumber].MatchingCollection, Mode=OneWay}"
                             SelectedItem="{Binding Path=Fields[CoNumber].SelectedMatching, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             Visibility="{Binding Path=Fields[CoNumber].IsVisibility, Mode=OneWay}"/>

Es funktioniert alles einwandfrei, nur ist das Verhalten/Aussehen des Steuerlements nicht so ganz das, was ich benötige:

Es gibt eine DatenKlasse mit mehrere Eigenschaftswerte, die für die Suche in den string 'MatchingValue' kombiniert eingetragen werden.

Nur bei der Auswahl eines Eintrags, wird mir in der AutoCompleteBox auch genau dieser Eintrag angezeigt, anstatt nur der Wert, der für dieses eine Control bestimmt ist.

Mein Problem ist, daß es keine weitere Eigenschaft gibt, mit der man angeben kann, was angezeigt werden soll.

Weiß jemand eine Möglichkeit dieses zu umgehen bzw. eine alternative Variante?

Bitte um Hilfe, vielen Dank!

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

T
314 Beiträge seit 2013
vor 9 Jahren

Dann bleibt dir vermutlich nichts anderes übrig, als das ItemTemplate entsprechend anzupassen.

T
ThomasE. Themenstarter:in
461 Beiträge seit 2013
vor 9 Jahren

Danke für die Antwort aber ich denke das ist falsch verstanden? oder hab ich was falsch verstanden?


<Style x:Key="AutoCompleteBoxDefault" TargetType="sdk:AutoCompleteBox">
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="Margin" Value="0,1"/>
                <Setter Property="IsDropDownOpen" Value="True"/>
                <Setter Property="FilterMode" Value="Contains"/>
                <Setter Property="MaxDropDownHeight" Value="200"/>
                <Setter Property="IsTextCompletionEnabled" Value="True"/>
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Path=MatchingValue}"/>
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Wie im angehängten Bild zu sehen ist:

  1. AutoCompleteBox, in der der ausgewählte Wert, des zusammengestöpselten ItemTemplate-Eintrags drinnen steht.. Benötigt wird aber nur der Schlüsselwert, z.Bsp 01
  2. Eine TextBox, in der der Text des Schlüsselwerts von 1) steht
  3. Das ItemTemplate besteht wie man sieht, nur aus einem TextBlock, weil der Wert, der rein zur Info im Template angezeigt wird, aus anderen Stellen zusammengestückelt wird, weil es sonst in diesem Control nicht benötigt wird.

[Edit1]
ABER trotzdem Danke für die Info, weil es mit mehreren Controls im ItemTemplate das Ergebnis liefern könnte, anstatt zu meiner bisherigen Vorgehensweise? Kann es jetzt nicht testen...
Dann stellt sich nur die Frage, wie kann ich rein dynamisch eine variable Anzahl an Eigenschaften für diese Anzeige bereitstellen? Weil ja sonst nicht, all diese Eigenschaften in einem Control, benötigt werden..
_ Mein Problem hat ja gar nix mit dem ItemTemplate zu tun, sondern mit dem schon besagten ValueMemberPath im Themenkopf. Denn in dieser Eigenschaft steht der Wert, nach dem gesucht und der auch dann angezeigt wird. Es muß ja möglich sein, nach mehreren Werten suchen zu können, als dieses eine Control bereit hält.. Angezeigt werden sollte aber nur, in diesem Fall, der Schlüsselwert._
[Edit2]
Noch zu erwähnen ist, daß das UI dynamisch geladen und mit dem XamlReader initiiert wird. Also es besteht keine direkte Verbindung zwischen dem Modell und dem UI. Alles rein durch Datenbindungen.
[/Edit2]
[/Edit1]

Und wie man an den Bindungen sieht:


{Binding Path=Fields[CoNumber].MatchingCollection, Mode=OneWay}

gehen die Bindungen schon weiter in die Tiefe. Das hat/hätte bei mir schon nicht mehr funktioniert:


{Binding Path=Fields[CoNumber].MatchingCollection[0].Value, Mode=OneWay}

Oder sollte es doch möglich sein?

Vielen Dank nochmals!

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

T
314 Beiträge seit 2013
vor 9 Jahren

Ich bin mir immer noch nicht ganz sicher was die Ausgangslage (datenmäßig ist).

Du bindest an eine Collection von MatchingValues. Was ist der Typ dahinter?
Bestitzt der Type denn die ganzen einzelnen Eigenschaften? Dann kannst Du ja einfach entsprechend den Textblock auf das gewünschte Binden.

Alternativ könntest Du auch einen Converter nutzen!?

Gruß
t0ms3n

T
ThomasE. Themenstarter:in
461 Beiträge seit 2013
vor 9 Jahren

Hallo,

Also der MatchingValue ist ein einfacher String, in dem die verschiedenen Werte eingefügt werden.

Mit einem Converter weiß ich nicht wie man unter meinen Umständen Arbeiten könnte, weil ja das UI nur durch Datenbindungen funktioniert und die XAML dynamisch geladen und initiiert wird, wie ich schon schrieb.

Hab aber eine Lösung gefunden, obwohl ich damit nicht ganz glücklich bin:

Ich durchsuche das dynamisch geladene Control mit dem VisualTreeHelper nach den bettroffenen Steuerelementen und wende an denen den ItemFiilter an.

Hierdurch kann der ValueMemberPath die Bindung haben, was zum Schluß in der AutoCompleteBox angezeigt wird (Value), kann aber in dem string 'MatchingValue' nach dem richtigen Ergebnis suchen.

Trotzdem Danke !

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄