我有一个包含WebView
的自定义控件。我还有一个ViewModel,它在构造函数中接受WebView并修改它。它将WebView
控件传递给修改它的VM。
最初,我想这样做:
public static readonly DependencyProperty AccountProperty =
DependencyProperty.Register("Account", typeof(Account), typeof(AccountViewControl),
new PropertyMetadata(null));
public Account Account {
get { return (Account)GetValue(AccountProperty); }
set {
SetValue(AccountProperty, value);
SiteViewModel SiteVM = new SiteViewModel(wv: wvAccount);
SiteVM.CurrentAccount = value;
SiteVM.LoginToSite();
}
}
每个控件都有一个名为WebView
的{{1}},它将被传递到wvAccount
构造函数中。但是,由于在使用SiteViewModel
时绕过了setter,我必须使用静态DependencyProperty
事件来调用PropertyChanged
,它无法访问控件的XAML中的WebView。 / p>
我的第一个想法是将一个SiteVM.LoginToSite
属性添加到SiteVM并将UI的WebView
绑定到该元素,但是,我似乎找不到任何方法来绑定到整个UI元素
这就是我想要实现的目标:
WebView
我会像这样绑定它:
public static readonly DependencyProperty SiteViewModelProperty =
DependencyProperty.Register("Account", typeof(SiteViewModel), typeof(AccountViewControl),
new PropertyMetadata(null, OnSiteViewModelChanged));
private static void OnSiteViewModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
SiteViewModel siteVM = (SiteViewModel)e.NewValue;
siteVM.LoginToSite();
}
有没有办法(或更好的方式)来实现这个目标?
答案 0 :(得分:2)
一般来说,我认为大多数开发人员会同意这是一个坏主意。但这并不意味着你无法做到这一点。让我们假装你的元素名为MyElement。这样做:
<Page.DataContext>
<local:MyViewModel Element="{Binding, ElementName=MyElement}" />
</Page.DataContext>
请记住,您在ViewModel中创建的Element属性的类型为UIElement,如果您希望它更强类型,则为实际的元素类型。
祝你好运!