绑定到SelectedItem

时间:2012-08-31 10:28:20

标签: .net wpf mvvm binding combobox

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

相机只是一个包含属性Nameid的简单类。

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

但是,如果我启动应用程序,则组合框为空。调试输出在启动应用程序后指出:

Active camera set to 713x BDA Analog Capture

如果我点击组合框,则会选择相机:

Combobox with selected Item

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

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,那么这一切都不会有问题。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

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

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

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

这将是第一个尝试的简单步骤,如果这没有帮助,请评论这个答案,我试着看看我能做些什么。


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

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

答案 1 :(得分:0)

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