我正在努力让CefSharp与Caliburn.Micro很好地合作,但这并不像我希望的那么容易。它可能仍然很容易,但我对它们中的任何一个都不太熟悉。
我在浏览器中添加了一个浏览器组件:
<cefsharp:ChromiumWebBrowser x:Name="Browser"></cefsharp:ChromiumWebBrowser>
然后我在视图模型中添加了一个具有相同名称的属性:
public ChromiumWebBrowser Browser { get; set; }
我现在希望Caliburn.Micro的魔法将此属性绑定到视图中的实际浏览器,以便我可以使用代码隐藏中的Browser
。
为了测试这一点,我尝试在激活视图时转到特定网页:
protected override void OnActivate()
{
Browser.Dispatcher.Invoke(() =>
{
Browser.Address = "http://stackoverflow.com";
NotifyOfPropertyChange(() => Browser);
});
base.OnActivate();
}
因为浏览器由不同的线程拥有,所以我正在使用Dispatcher来正确访问它。
所有这些代码都运行正常,没有任何例外,但是在浏览器加载时不会打开SO。
我猜这是因为我无法让Caliburn.Micro将两个ChromiumWebBrowser
对象正确绑定在一起。
我该如何做到这一点?
答案 0 :(得分:0)
您必须添加自定义约定以基于x:Name
绑定到该控件。没有办法解决这个问题,因为它是第三方控制,否则你将不得不使用属性..开箱即用的唯一控件是包含在wpf / silver / windows phone框架中的控件对于.NET。如果内存为我服务,那么该特定控件还需要一些其他步骤来initialize
。
http://caliburnmicro.com/documentation/conventions
Telerik用于Windows Phone的UI的自定义约定示例
ConventionManager.AddElementConvention<RadDataBoundListBox>(DataControlBase.ItemsSourceProperty, "ItemsSource", "SelectionChanged");
ConventionManager.AddElementConvention<RadDockPanel>(RadDockPanel.DockProperty, "Dock", "DockChanged");
ConventionManager.AddElementConvention<RadListPicker>(ItemsControl.ItemsSourceProperty, "ItemsSource", "SelectionChanged");
ConventionManager.AddElementConvention<RadDatePicker>(DateTimePicker.ValueProperty, "Value", "ValueChanged");
ConventionManager.AddElementConvention<RadTimePicker>(DateTimePicker.ValueProperty, "Value", "ValueChanged");
ConventionManager.AddElementConvention<RadToggleSwitch>(RadToggleSwitch.IsCheckedProperty, "IsChecked", "CheckChanged");
ConventionManager.AddElementConvention<RadContextMenuItem>(RadContextMenuItem.CommandProperty, "Command", "Tap");
ConventionManager.AddElementConvention<RadHubTile>(HubTileBase.CommandProperty, "Command", "Tap");
这些是非常基本的,但让他们相应地工作。
ConventionManager.AddElementConvention<Pivot>(ItemsControl.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
(viewModelType, path, property, element, convention) =>
{
if (ConventionManager
.GetElementConvention(typeof(ItemsControl))
.ApplyBinding(viewModelType, path, property, element, convention))
{
ConventionManager
.ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);
ConventionManager
.ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, null, viewModelType);
return true;
}
return false;
};
与ItemsControl的SelectedItem相关的更高级约定...
正如您所看到的,它完全依赖于控件本身以及可供使用的可用DependencyProperties。