Frage

Ich habe zwei Listboxen, die beide Erweiterte Selection verwenden. Die Itemssource des ersten ist eine Liste, und verwendet ein Datatemplate. Ich versuche, eine Ansammlung von einer Eigenschaft von der ersten als Itemssource für das zweite zu verwenden. Zum Beispiel:

public class MultiAppPropertyAggregator : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
    IList<SomeObject> selectedItems = value as IList<SomeObject>;
    Dictionary<string, string> bundles = new Dictionary<string,string>();
    foreach(SomeObject myobj in selectedItems) {
        foreach(KeyValuePair<string,string> name in myobj.Names) {
           selectedItems.Add(name.Key, name.Value);
....

<ListBox x:Name="lstApplication" ItemsSource="{Binding}" SelectionChanged="lstApplication_SelectionChanged" SelectionMode="Extended" />
<ListBox x:Name="lstBundles" ItemsSource="{Binding ElementName=lstApplication,Path=SelectedItems,Mode=OneWay,Converter={StaticResource MultiAppPropertyAggregator}}" ItemTemplate="{StaticResource DictionaryList}" SelectedValuePath="Key" SelectionMode="Extended" />

So werden die Objekte in der ersten Liste eine Eigenschaft vom Typ Wörterbuch enthalten. Ich möchte alle Artikel in den Wörterbüchern aller ausgewählten Elemente in der ersten Liste in die zweite Liste hinzuzufügen.

Der Konverter scheint Anfangslast genannt zu werden, dann nicht wieder nach, und ich mit einem leeren zweiten Listenfeld landen. Bin ich etwas fehlt?

War es hilfreich?

Lösung

Ich würde vermuten, dass Sie Konverter sind nur einmal genannt, weil SelectedItems auf einem Listenfeld kein DependencyProperty ist, und daher wird die Bindung nicht mitteilen, dass sie aktualisiert hat.

Tun diese Umwandlung in Ihrem Code-Behind / Viewmodel

Sie können besser dran sein (je nachdem, welche Methode Sie folgen) und eine Eigenschaft für das zweite Listenfeld Aussetzen zu binden.

Sie können dies tun, in einer von zwei Möglichkeiten, die ich mir vorstellen kann. Erstens können Sie auf Selection auf der ersten Liste hören und die Eigenschaft aktualisieren, die die zweite Liste gebunden ist. Oder können Sie eine IsSelected put Eigenschaft auf den Elementen, die die erste Liste gebunden ist, und Ihre zweite Liste aktualisieren, wenn diese an einem bestimmten Punkt ändern. Sie können diesen Stil hinzufügen, für ListBoxItem die IsSelected Eigenschaft zwischen dem Datenelement und der Ansicht zu synchronisieren:

<Style TargetType="{x:Type ListBoxItem}">
   <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>

Meine Vermutung ist, dass der erste weniger schwierig sein wird, zu implementieren, obwohl es nicht vollständig mit dem, was UI Methodik Sie folgen.

Netz kann
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top