【发布时间】:2009-02-16 03:25:56
【问题描述】:
我有两个项目。一个正在工作,另一个没有,但是它们之间的差异并不是我认为“应该”有任何重要性的。第一个项目是损坏的,这是我正在尝试修复的项目。第二个项目是我在第一个项目根本不起作用时创建的一个小示例项目。当然,示例效果很好。
这是第一个项目的视图。我删除了一堆“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; }
}
}
当我从调试器运行项目时,首先会想到调用的是 Subscriptions 集合的 getter。然后在 SelectedSubscription 上调用 setter(它为空)。之后,我可以更改组合框中的选定项目,直到我的脸变蓝并且 SelectedSubscription 属性的设置器不会再次更改。请务必注意,组合框确实包含正确的值。
在第二个项目中,代码是相同的,但首先调用的是 SelectedSubscription 属性的 setter(它为 null),然后调用 Subscriptions 集合的 getter,最后调用 SelectedSubscription 的 setter time 并且它的值与 Subscriptions 集合中的第一项匹配。
这颗小宝石花了我大约 5 个小时,如果您有任何想法我愿意尝试。
谢谢
【问题讨论】:
标签: wpf combobox selectedvalue