Combobox无法正确绑定到SelectedItem

时间:2009-02-16 03:25:56

标签: 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>

以下是设置为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(它为null)。之后,我可以更改组合框中的选定项目,直到我脸部呈蓝色,并且SelectedSubscription属性的setter不会再次更改。重要的是要注意组合框确实包含正确的值。

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

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

由于

3 个答案:

答案 0 :(得分:1)

可能会改变

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

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

答案 1 :(得分:0)

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

作为次要问题,我建议将System.Diagnostics名称空间添加到您的XAML中。它将使错误显示在Visual Studio输出窗口中。

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

作为一个可能相关的点(因为它不是很清楚破坏项目中的问题是什么),你可能会看一下this StackOverflow question(“Combobox控制Tabcontrol”),它与:

  • WPF,
  • ComboBoxes,
  • TabControls和
  • 使用SelectedIndex在它们之间进行绑定。

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

最后,Josh Smith's MSDN code非常大。在没有看到所有代码的情况下,很难弄清楚你改变了什么来添加你的ComboBox。

答案 2 :(得分: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,因为它没有理由让它变得动态。

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