如何绑定到整个UI元素

本文关键字:UI 元素 何绑定 绑定 | 更新日期: 2023-09-27 18:03:37

我有一个包含WebView的自定义控件。我也有一个ViewModel,它在构造函数中接受WebView并修改它。它将WebView控制传递给要修改它的虚拟机。

最初,我想这样做:

    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();
        }
    }

每个控件都有一个名为wvAccountWebView,它将被传递到SiteViewModel构造函数中。然而,由于setter在使用DependencyProperty时被绕过,我必须使用静态PropertyChanged事件来调用SiteVM.LoginToSite,这将无法访问控件的XAML内的WebView。

我的第一个想法是向SiteVM添加一个WebView属性,并将UI的WebView绑定到该元素,然而,我似乎找不到任何方法来绑定到整个UI元素。

这是我想要达到的目标:

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();
}

我将像这样绑定它:

<WebView {x:Bind=SiteVM.WebView} Visibility="{Binding ShowEditControl, ElementName=accountControl, Converter={ThemeResource InverseVisConverter}}" x:Name="wvAccount" />

是否可能有一种方法(或更好的方法)来实现这一点?

如何绑定到整个UI元素

一般来说,我认为大多数开发人员都会同意这是一个坏主意。但这并不意味着你做不到。假设您的元素名为MyElement。这样做:

<Page.DataContext>
    <local:MyViewModel Element="{Binding, ElementName=MyElement}" />
</Page.DataContext>

请记住,您在ViewModel中创建的Element属性的类型是UIElement,如果您希望它更强类型,则可以使用实际的元素类型。

祝你好运!