首页 > 解决方案 > 自定义 XAML 绑定源类

问题描述

我正在尝试找到一种更好的方法来声明 UWP XAML 页面使用的 ViewModel。

这一刻,

  1. 我声明了一个ViewModelClass包含我的数据属性的 ViewModel 类。
  2. 然后我声明该类的一个实例作为StaticResource页面。我喜欢在我的所有页面设计中调用这些VIEW以保持一致性。
  3. 最后,我将 Page 的 DataContext 声明为StaticResource VIEW.

这会产生一个页面,该页面了解正在使用的数据结构并在工作绑定时允许自动完成。很好,虽然有很多行相同的旧代码。

只是,它并不真正适合 ViewModel,因为声明的资源是静态资源。它在页面实例化时被实例化。大多数页面会收到一个 ViewModel 参数 on NavigatedTo,它不能用于替换静态资源,因为它是,好吧。静止的。

所以我最终DataContext在导航时将页面从初始引用更改VIEW为我实际想要使用的 ViewModel 实例。

DataContext需要注意的是,当在 Master-Detail 情况的深处相当可怕时,要声明对页面的反向引用。想象一个集合,其显示部分取决于大师的财产。

你如何DataContext从页面内的任何地方牢固地绑定到页面?

我尝试为页面命名(PAGE为简单起见),然后使用ElementName=PAGE, Path=DataContext.someProperty. 丑陋,再加上你丢失了 . 所代表的类的所有信息DataContext

另一种方法是围绕只有一个属性的实际ViewModel调用创建一个 Wrapper : . 现在我可以将包装器声明为,并告诉页面的顶层用作它的. 工作,可靠,但太笨拙和麻烦。StaticViewModelpublic ViewModel viewModelStaticResourceFrameworkElementVIEW.viewModelDataContext

我很想实现一个SOURCE名为绑定的类,PageDataContext它只会循环进入页面并DataContext从那里获取。想象:{Binding someProperty, Source={PageDataContext}

我将如何为 UWP 应用程序声明所说的源类???

标签: c#xamlmvvmdata-bindinguwp

解决方案


我很想为称为 PageDataContext 的绑定实现一个 SOURCE 类,它只会循环进入页面并从那里获取 DataContext。想象一下:{Binding someProperty, Source={PageDataContext}

对于您的要求,您可以在页面中实现您的视图模型Resources并为其提供 x:key。当您绑定视图模型的属性时,您可以使用 x:key 访问此视图模型,Source={StaticResource ViewModel}更多信息请参考以下代码。

视图模型

public class ViewModel
{
    public ViewModel()
    {
        Visibility = false;
    }
    public bool Visibility { get; set; }
}
Xaml

<Page.Resources>
    <local:ViewModel x:Key="ViewModel" />
</Page.Resources>

 <TextBlock
   Width="100"
   Height="44"
   Text="{x:Bind Name}"
   Visibility="{Binding Visibility, Source={StaticResource ViewModel}}" />
   

推荐阅读