Question

Je me gratte la tête depuis un moment et je suis perplexe pour le moment.

Le scénario du problème est plus simple à expliquer en tant que code, donc il parle de lui-même. Tout d’abord, j’ai une application silverlight avec les éléments suivants dans le 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>

Mon code-behind ressemble à ceci ... (le tout écrit dans un seul fichier de classe afin que vous puissiez le copier facilement dans votre propre projet et le compiler)

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

Alors laissez-moi vous expliquer ... J'ai décidé d'écrire une méthode générique de création d'une ObservableCollection dotée de la propriété SelectedItem afin que, lorsque je lie la collection à une zone de liste déroulante, par exemple, je puisse lier la SelectedItem de la zone de liste déroulante à la liste déroulante. forte propriété à elle.

Cependant, pour une raison quelconque, cela ne semble pas fonctionner lorsque la zone de liste déroulante est réellement imbriquée via un ItemTemplate. J'ai effectivement une liste de listes, un scénario assez simple pour que je ne sache plus ce qui ne va pas.

Lorsque vous exécutez le code, vous constaterez que le contrôle ComboBox basé sur un modèle récupère les éléments corrects, mais il n'est jamais défini sur SelectedItem malgré la liaison.

Je sais que c'est plutôt long, mais ... des idées?

Merci beaucoup

Était-ce utile?

La solution

La sortie du débogueur vous donne un indice sur le problème:

Erreur System.Windows.Data: Erreur de chemin BindingExpression: La propriété 'SelectedItem' est introuvable sur 'ExpressionElements.SomeClass' 'ExpressionElements.SomeClass' (HashCode = 49044892). BindingExpression: Path = 'SelectedItem' DataItem = 'ExpressionElements.SomeClass' (HashCode = 49044892); l'élément cible est 'System.Windows.Controls.ComboBox' (Name = ''); La propriété cible est 'SelectedItem' (type 'System.Object') ..

Étant donné que le contexte de données du modèle est une instance de la classe SomeClass, il vous suffit de remplacer la liaison SelectedItem de SelectedItem par StringsChild.SelectedItem :

<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top