У меня есть два проекта. Один работает, а другой нет, однако различия между ними, я думаю, «не должны иметь» никакого значения. Первый проект - тот, который сломан, и это тот, который я пытаюсь исправить. Второй проект - это небольшой пример проекта, который я создал, когда первый проект просто не работает вообще. Конечно, образец работает отлично.
Вот вид для первого проекта. Я удалил кучу «MainWindowTabControlStyle», потому что это просто поле со списком, который сломан. Я вполне уверен, что проблема не в стиле, потому что это копирование и вставка из проекта, который работает.
<Grid>
<TabControl Style="{DynamicResource MainWindowTabControlStyle}">
<TabItem Header="Tab 1"/>
<TabItem Header="Tab 2"/>
</TabControl>
</Grid>
<Style x:Key="MainWindowTabControlStyle" TargetType="{x:Type TabControl}">
...
<ComboBox
HorizontalAlignment="Right"
VerticalAlignment="Top"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Subscriptions, Mode=Default}"
SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"
ItemTemplate="{DynamicResource SubscriptionsItemTemplate}"/>
...
</Style>
<DataTemplate x:Key="SubscriptionsItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName, Mode=Default}"/>
</StackPanel>
</DataTemplate>
Вот модель представления, для которой задан DataContext MainWindow. Класс ViewModelBase - это тот же код, который Джош Смит написал в этой статье MSDN за несколько месяцев.
public sealed class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
}
private ObservableCollection<Subscription> subscriptions;
public ObservableCollection<Subscription> Subscriptions
{
get
{
if (subscriptions == null)
{
subscriptions = new ObservableCollection<Subscription>();
subscriptions.Add(new Subscription() { DisplayName = "ABC" });
subscriptions.Add(new Subscription() { DisplayName = "XYZ" });
subscriptions.Add(new Subscription() { DisplayName = "PDQ" });
}
return subscriptions;
}
set { subscriptions = value; }
}
private Subscription selectedSubscription;
public Subscription SelectedSubscription
{
get { return selectedSubscription; }
set { selectedSubscription = value; }
}
}
Когда я запускаю проект из отладчика, первое, что вызывается, - это метод получения коллекции подписок. Затем сеттер вызывается в SelectedSubscription (это значение равно нулю). После этого я могу изменять выбранный элемент в выпадающем списке до тех пор, пока он не станет синим на лице, и установщик свойства SelectedSubscription снова не изменится. Важно отметить, что комбинированный список содержит правильные значения.
Во втором проекте код идентичен, но первым, что вызывается, является установщик для свойства SelectedSubscription (оно равно null), затем вызывается метод получения для коллекции подписок и, наконец, вызывается установщик для SelectedSubscription время и имеет значение, соответствующее первому элементу в коллекции подписок.
Этот маленький драгоценный камень стоил мне около 5 часов, если у вас есть какие-либо идеи, я готов попробовать.
Спасибо