Я уже давно почесал голову на этом и сейчас в тупике.
Сценарий проблемы легче объяснить как код, так что, надеюсь, он говорит сам за себя. Прежде всего, у меня есть приложение silverlight со следующим в 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>
Мой код выглядит следующим образом ... (все написано в одном файле класса, так что вы легко можете скопировать его в свой собственный проект и скомпилировать)
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"));
}
}
}
}
Итак, позвольте мне объяснить ...
Я решил написать общий способ создания ObservableCollection, который имеет свойство SelectedItem , чтобы при привязке коллекции, например, к ComboBox, я мог связывать ComboBox SelectedItem собственность к нему.
Однако, по некоторым причинам, это не работает, когда ComboBox эффективно вложен через ItemTemplate. У меня фактически есть список списков, достаточно простой сценарий, и я заблудился относительно того, что не так.
Когда вы запустите код, вы увидите, что шаблонный ComboBox действительно выбирает правильные элементы, но он никогда не устанавливается на SelectedItem, несмотря на привязку.
Я знаю, что это довольно долго, но ... есть идеи?
Большое спасибо