5

我有两个项目。一个正在工作,另一个没有,但是它们之间的差异并不是我认为“应该”有任何重要性的。第一个项目是损坏的,这是我正在尝试修复的项目。第二个项目是我在第一个项目根本不起作用时创建的一个小示例项目。当然,样本工作得很好。

这是第一个项目的视图。我删除了一堆“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 个小时。

谢谢

4

3 回答 3

1

可能改变

SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}" 

SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}" 
于 2009-02-16T03:43:39.270 回答
0

调试此问题的正确方法是获取工作项目并交替(修改它以匹配损坏的代码/确认它工作),直到它与损坏的项目相同或损坏。它中断的点告诉你问题出在哪里。修改损坏的项目通常是一个失败的原因。

作为第二点,我建议将 System.Diagnostics 命名空间添加到您的 XAML。它会使错误出现在 Visual Studio 输出窗口中。

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase"

作为一个可能相关的点(因为目前还不清楚损坏的项目中的问题是什么),您可能会查看与以下内容相关的 StackOverflow 问题(“Combobox controling Tabcontrol”):

  • WPF,
  • 组合框,
  • 选项卡控件,和
  • 使用 SelectedIndex 在它们之间进行绑定。

这个问题还没有解决方案,但这是一个更简单的问题。

最后,Josh Smith 的 MSDN 代码非常庞大。如果不查看所有代码,很难弄清楚添加 ComboBox 所做的更改。

于 2009-02-16T18:07:47.760 回答
0

很抱歉延迟发布答案。启动和运行 Open ID 存在某种问题。

这是一个非常奇怪的问题。

这个问题的解决方案根本不是来自窗口。在调用窗口的 show 方法之前,有另一个窗口作为对话框打开。在此对话框中有以下资源

<Window.Resources>
    <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/>
</Window.Resources>

它被同一窗口中的两个文本块引用为“DynamicResource”。关闭对话框并使应用程序从出现问题的窗口启动后,发现问题是由对话框窗口引起的。当我在研究这个问题时,一位同事建议我将 DynamicResource 转换为 StaticResource,因为它没有理由成为动态的。

使用仅在对话窗口范围内可用的资源在对话窗口中进行的此更改修复了上述“主窗口”中描述的绑定问题。我猜奇怪的事情可能会发生。

于 2009-02-17T16:07:40.643 回答