Frage

Ich habe jetzt eine Zeit lang auf diesem Kopf wurde Kratzen und im Moment bin ratlos.

Das Problem Szenario ist einfacher als Code zu erklären, so dass hoffentlich es für sich selbst spricht. Zunächst einmal, ich habe eine Silverlight-Anwendung mit dem folgend in der XAML ...

<UserControl x:Class="SilverlightApplication2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Width="400" Height="300">

<UserControl.Resources>
    <DataTemplate x:Key="icTemplate">
        <ComboBox ItemsSource="{Binding StringsChild}" SelectedItem="{Binding SelectedItem}"/>
    </DataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ItemsControl x:Name="ic" ItemTemplate="{StaticResource icTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

    <Button Click="Save" Grid.Row="1" Content="GO"/>
</Grid>

Mein Code-behind sieht wie folgt aus ... (alle in einer einzigen Klasse-Datei geschrieben, so dass es einfach ist, damit Sie es in das eigene Projekt zu kopieren und kompilieren)

namespace SilverlightApplication2
{
    public partial class Page : UserControl
    {
        public ObservableCollection<SomeClass> StringsParent { get; set; } 

        public Page()
        {   
            InitializeComponent();
            StringsParent = new ObservableCollection<SomeClass>();
            ic.ItemsSource = StringsParent;
        }

        private void Save(object sender, RoutedEventArgs e)
        {
            SomeClass c = new SomeClass();
            c.StringsChild.Add("First");
            c.StringsChild.Add("Second");
            c.StringsChild.SetSelectedItem("Second");
            StringsParent.Add(c);
        }
    }

    public class SomeClass
    {
        public SelectableObservablecollection<string> StringsChild { get; set; }

        public SomeClass()
        {
            StringsChild = new SelectableObservablecollection<string>();
        }    
    }

    public class SelectableObservablecollection<T> : ObservableCollection<T>
    {
        public SelectableObservablecollection()
            : base()
        {

        }

        public void SetSelectedItem<Q>(Q selectedItem)
        {
            foreach (T item in this)
            {
                if (item.Equals(selectedItem))
                {
                    SelectedItem = item;
                    return;
                }
            }
        }

        private T _selectedItem;
        public T SelectedItem
        {
            get
            {
                return _selectedItem;
            }
            set
            {
                _selectedItem = value;
                OnPropertyChanged(new PropertyChangedEventArgs("SelectedItem"));
            }
        }
    }
}

Lassen Sie mich erklären ... Ich habe zu schreiben, eine generische Art und Weise eine ObservableCollection zu schaffen, die auf es ein SelectedItem Eigenschaft hat, so dass, wenn ich die Sammlung zu einem ComboBox zum Beispiel binden, kann ich die ComboBox binden SelectedItem Eigenschaft zu.

Doch aus irgendeinem Grund, es scheint nicht zu funktionieren, wenn die ComboBox effektiv über eine ItemTemplate verschachtelt ist. Ich habe tatsächlich eine Liste von Listen, ein Szenario, das einfach genug ist, dass ich bin verloren, was falsch ist.

Wenn Sie den Code ausführen Sie werden sehen, dass die Templat-ComboBox die richtigen Elemente nicht abholen, aber es ist nie zu einem SelectedItem trotz der Bindung festgelegt.

Ich weiß, es ist ziemlich langatmig, aber ... irgendwelche Ideen?

Thanks a lot

War es hilfreich?

Lösung

Der Debugger Ausgang tatsächlich gibt Ihnen einen Hinweis auf das Problem:

System.Windows.Data Fehler: Bindingpfadfehler: 'SelectedItem' Eigenschaft nicht auf 'ExpressionElements.SomeClass' 'ExpressionElements.SomeClass' (HashCode = 49044892) gefunden. Binding: Path = 'SelectedItem' DataItem = 'ExpressionElements.SomeClass' (HashCode = 49044892); Zielelement ist 'System.Windows.Controls.ComboBox' (Name = ''); Zieleigenschaft ist 'SelectedItem' (Typ 'System.Object') ..

Da der Datenkontext für die Vorlage ist eine Instanz der Klasse Someclass, alles, was Sie tun müssen, ist die SelectedItem von SelectedItem Bindung ändern zu StringsChild.SelectedItem :

<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top