Combobox无法正确绑定到SelectedItem

5 wpf combobox selectedvalue

我有两个项目.一个是工作,另一个不是,但他们之间的差异并不是我认为"应该"具有任何重要性.第一个项目是破坏的项目,它是我想要解决的项目.第二个项目是我在第一个项目根本无法工作时创建的一个小样本项目.当然样本效果很好.

这是第一个项目的视图.我删除了一堆"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>
Run Code Online (Sandbox Code Playgroud)

以下是设置为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; } 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

当我从调试器运行项目时,首先认为调用的是Subscriptions集合的getter.然后在SelectedSubscription上调用setter(它为null).之后,我可以更改组合框中的选定项目,直到我脸部呈蓝色,并且SelectedSubscription属性的setter不会再次更改.重要的是要注意组合框确实包含正确的值.

在第二个项目中,代码是相同的,但第一个被调用的是SelectedSubscription属性的setter(它为null),然后调用Subscriptions集合的getter,最后第二次调用SelectedSubscription的setter并且它具有与Subscriptions集合中的第一个项匹配的值.

如果你有任何想法,这个小宝石花了我大约5个小时我愿意尝试.

谢谢

Rya*_*sen 0

很抱歉延迟发布答案。启动和运行 Open ID 时遇到了一些问题。

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

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

<Window.Resources>
    <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

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

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