我有两个项目。一个正在工作,另一个没有,但是它们之间的差异并不是我认为“应该”有任何重要性的。第一个项目是损坏的,这是我正在尝试修复的项目。第二个项目是我在第一个项目根本不起作用时创建的一个小示例项目。当然,样本工作得很好。
这是第一个项目的视图。我删除了一堆“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>
这是设置为 MainWindow 的 DataContext 的视图模型。ViewModelBase 类与 Josh Smith 在本月 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; }
}
}
当我从调试器运行项目时,第一个调用的想法是订阅集合的 getter。然后在 SelectedSubscription 上调用 setter(它为空)。之后,我可以更改组合框中的选定项目,直到我的脸变成蓝色并且 SelectedSubscription 属性的设置器不会再次更改。请务必注意,组合框确实包含正确的值。
在第二个项目中,代码是相同的,但首先调用的是 SelectedSubscription 属性的 setter(它为 null),然后调用 Subscriptions 集合的 getter,最后第二次调用 SelectedSubscription 的 setter,它具有与 Subscriptions 集合中的第一项匹配的值。
如果您有任何想法我愿意尝试,这颗小宝石花了我大约 5 个小时。
谢谢