3

我在我的应用程序中使用 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.

在 ViewModel的ActiveCamera构造函数中设置为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如果在应用程序启动时实际选择了边界,这一切都不是问题。有没有办法做到这一点?

4

2 回答 2

0

不确定这是否是问题,但我不记得 TwoWay 绑定是否是默认的。

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

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

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


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

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

于 2012-08-31T17:00:23.817 回答
0

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

于 2013-07-22T14:28:33.523 回答