【问题标题】:Binding to SelectedItem绑定到 SelectedItem
【发布时间】:2012-08-26 03:54:08
【问题描述】:

我在我的应用程序中使用 WPF 功能区库并定义了一个这样的组合框:

<r:RibbonComboBox>
    <r:RibbonGallery SelectedItem="{Binding ActiveCamera}">
        <r:RibbonGalleryCategory ItemsSource="{Binding AvailableCameras}"/>
    </r:RibbonGallery>
</r:RibbonComboBox>

绑定源定义在窗口的DataContext:

public Camera[] AvailableCameras
{
    get ...
}

public Camera ActiveCamera
{
    get { return _activeCamera; }
    set
    {
        if (_activeCamera != value && value != null)
        {
            _activeCamera = value;
            Notify("ActiveCamera");
            'Some more logic that is not related to UI
        }
        Debug.WriteLine("Active camera set to " + value);
    }
}

Camera 只是一个具有Nameid 属性的简单类。

ActiveCamera 在 ViewModel 的构造函数中设置为 AvailableCameras 的第一项。我可以在代码中验证这一点。

但是,如果我启动应用程序,组合框是空的。启动应用程序后调试输出表明:

Active camera set to 713x BDA Analog Capture

如果我点击组合框,相机似乎被选中:

此外,添加了以下调试输出:

Active camera set to

如果我随后单击窗口中的其他位置,组合框将关闭并保持为空。添加了以下调试输出:

Active camera set to

但这种行为似乎并不一致。如果我单击组合框,然后再次单击窗口中的其他位置,则会选择第一个摄像头并添加以下调试输出:

Active camera set to           (on click on the combobox)
Active camera set to 713x BDA Analog Capture

如果绑定SelectedItem 在应用程序启动时实际被选中,这一切都不是问题。有什么方法可以实现吗?

【问题讨论】:

  • 你有没有想过这个问题?我注意到了同样的行为,这非常令人沮丧。我偶然发现这个问题正在寻找另一个问题,但我不会通过这个问题标题猜到问题。
  • @DBueno:我担心不会。我记不太清了,因为已经有一段时间了。但如果我找到解决方案,我会发布答案。

标签: .net wpf mvvm binding combobox


【解决方案1】:

不确定这是否是问题,但我不记得这里是否默认双向绑定。

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

还要确保当您设置初始相机时,它是通过属性ActiveCamera 而不是字段_activeCamera 以确保调用Notify

这些将是尝试的第一个简单步骤,如果这没有帮助,请对此答案发表评论,我尝试看看是否有什么我可以做的。


另一个疯狂的猜测。我注意到您的收藏是一个数组。这不会通知对集合的任何更改,因此如果稍后添加项目,它将通知 GUI。由于该项目出现在列表中,我想这不是问题。你可以试试把它改成ObservableCollection&lt;Camera&gt;

通过更好地阅读您的帖子,我的猜测是您不是这里的初学者,并且非常了解 WPF 数据绑定的细微差别。对吗?

【讨论】:

  • 显式定义TwoWay 会导致相同的行为。肯定会调用 Notify。
  • 是的,我知道数据绑定的细微差别;)。 ItemsSource 是一个永远不会再被触及的数组。好像和ribbon控件的特殊性有关。
【解决方案2】:

我最近偶然发现了一个似乎没有这个问题的RibbonGallery example(即在启动时,所选项目正确显示)。他们有一个有趣的解决方案来管理 RibbonGallery 数据。他们创建了一个类GalleryData&lt;T&gt;,该类分别具有 SelectedItem 和 ItemsSource 绑定的 SelectedItem 和 CategoryDataCollection 属性。这些绑定由针对 RibbonGallery 类型的样式处理。当我从样式中删除 SelectedItem 绑定并将其移动到库控件本身时,启动时没有选择。以一种风格进行这些绑定似乎很奇怪,但如果这就是它所需要的,那么我想没关系。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2010-12-26
    • 2011-01-02
    • 1970-01-01
    • 2014-10-10
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多