我在我的应用程序中使用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);
}
}
相机只是一个包含属性Name
和id
的简单类。
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
,那么这一切都不会有问题。有没有办法实现这个目标?
答案 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绑定并将其移动到库控件本身时,启动时没有选择。在一个风格中做这些绑定似乎很奇怪,但如果这就是它需要的那么我想它没关系。希望有所帮助。