我在应用程序中使用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,那么这一切都不是问题。有什么办法可以做到这一点吗?
发布于 2012-08-31 17:00:23
不确定这是否是问题所在,但我不记得这里是否默认使用TwoWay绑定。
SelectedItem="{Binding Path=ActiveCamera, Mode=TwoWay}"还要确保在设置初始摄像机时,它是通过属性ActiveCamera而不是字段_activeCamera来确保调用Notify的。
这将是尝试的第一个简单步骤,如果这没有帮助,请评论这个答案,我试着看看是否有什么我能做的。
又一次疯狂的猜测。我注意到您的集合是一个数组。这不会通知对集合的任何更改,因此如果稍后添加项,它将通知GUI。当项目出现在列表中时,我想这不是问题所在。您可以尝试将其更改为ObservableCollection<Camera>。
我从阅读你的文章更好的猜测是,你并不是这里的初学者,并且很清楚WPF数据库的细微差别。对吗?
发布于 2013-07-22 14:28:33
我最近偶然发现了一个似乎没有这个问题的RibbonGallery实例 (也就是说,在启动时,所选的项目显示得很正确)。他们有一个有趣的解决方案来管理RibbonGallery数据。他们创建了一个类GalleryData<T>,它分别具有一个SelectedItem和一个CategoryDataCollection属性,分别用于SelectedItem和ItemsSource绑定。这些绑定由针对RibbonGallery类型的样式处理。当我从样式中删除SelectedItem绑定并将其移动到图片库控件本身时,启动时没有选择。用一种方式进行这些绑定似乎很奇怪,但是如果这就是它所需要的,那么我想它是可以的。希望这能有所帮助。
https://stackoverflow.com/questions/12213498
复制相似问题