C# 自定义XAML绑定源类

C# 自定义XAML绑定源类,c#,xaml,mvvm,data-binding,uwp,C#,Xaml,Mvvm,Data Binding,Uwp,我试图找到一种更好的方法来声明UWP XAML页面使用的ViewModel 此时此刻, 我声明了一个包含数据属性的ViewModel类ViewModelClass 然后我将该类的一个实例声明为页面的StaticResource。我喜欢调用那些视图,以确保我所有页面设计的一致性 最后,我将页面的DataContext声明为与静态资源视图的绑定 这将生成一个了解正在使用的数据结构的页面,并允许在处理绑定时自动完成。不错,虽然有很多相同的代码行 只是,它并不真正适合ViewModels,因为声明的资源

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

此时此刻,

  • 我声明了一个包含数据属性的ViewModel类
    ViewModelClass
  • 然后我将该类的一个实例声明为页面的
    StaticResource
    。我喜欢调用那些
    视图
    ,以确保我所有页面设计的一致性
  • 最后,我将页面的DataContext声明为与
    静态资源
    视图
    的绑定
  • 这将生成一个了解正在使用的数据结构的页面,并允许在处理绑定时自动完成。不错,虽然有很多相同的代码行

    只是,它并不真正适合ViewModels,因为声明的资源是一个静态资源。当页面被实例化时,它被实例化。大多数页面将在导航到时收到ViewModel参数,该参数不能用于替换静态资源,因为它是。静态的

    因此,在导航时,我最终将页面的
    DataContext
    从最初的
    VIEW
    引用更改为我实际想要使用的ViewModel实例

    最大的警告是,当主细节的内部情况相当糟糕时,声明对页面的
    DataContext
    的反向引用。设想一个集合,其显示部分取决于主对象的属性

    如何从页面内部的任何位置牢固地绑定到页面的
    DataContext

    我尝试给页面命名(
    page
    为简单起见),然后使用
    ElementName=page,Path=DataContext.someProperty
    。丑陋,而且您将丢失由
    DataContext
    表示的类的所有信息

    另一种方法是围绕实际的
    ViewModel
    创建一个名为
    StaticViewModel
    的包装器,该包装器只有一个属性:
    public ViewModel ViewModel
    。现在,我可以将包装器声明为一个
    StaticResource
    ,并告诉页面的顶级
    FrameworkElement
    使用
    VIEW.viewModel
    作为其
    DataContext
    。工作正常、可靠,但非常落后且笨重

    我希望为名为
    PageDataContext
    的绑定实现一个
    SOURCE
    类,该类除了循环到页面中并从那里获取
    DataContext
    之外什么都不做。 想象:
    {Binding someProperty,Source={PageDataContext}

    我如何为UWP应用程序声明所述源类??

    我希望为名为PageDataContext的绑定实现一个源类,该类除了循环到页面中并从那里获取DataContext之外,什么都不做

    根据您的要求,您可以在页面
    Resources
    中实现viewmodel,并为其指定x:key。绑定viewmodel属性时,您可以使用x:key
    Source={StaticResource viewmodel}
    访问此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}}" />
       
    
    公共类视图模型
    {
    公共视图模型()
    {
    可见性=假;
    }
    公共布尔可见性{get;set;}
    }
    Xaml
    
    嗯,到目前为止还没有骰子。 使用所有这些选项,我发现最好的是一个包装器类,它可以分配给静态资源,而静态资源又是页面的
    DataContext
    的基础。然后在
    OnNavigatedTo()期间分配实际
    ViewModel
    的包装实例
    并用作页面的基本
    框架元素的
    DataContext

    Brr,这么多冗长的代码


    仍然想知道如何实现一个不同版本的
    源代码
    指令。没有办法为数据绑定声明自己的
    源代码吗?这些东西真的硬编码到框架中了吗???

    你检查过UWP绑定深度了吗。哦,等等,我想我知道你要去哪里…
    public Page.HostViewModel ViewModel{get;set;}
    ?将其作为页面的属性,然后使用
    {x:Bind Path=ViewModel.
    引用属性?我会尝试。当然,问题是为什么绑定语法中没有框架级引用…从来都不需要这样…不,不是这样。它在页面实例的生命周期中是静态的,而不是我正在寻找的…任何允许我提供自己的版本的东西源的初始化?什么是
    StaticResource
    基于?同样,它指的是在页面实例化后无法更改的静态资源。因此,将新的
    ViewModel
    实例分配给该静态资源不是解决方案,因为
    OnNavigatedTo()
    将提供新的
    ViewModel
    实例的事件不能再更改所述资源。为什么要通过导航方法发送ViewModel?一般来说,我们只发送参数并在ViewModel中处理它。为什么要这样做?我发送了希望页面显示的ViewModel。这样,我就可以让它们处于待机状态每次我在页面中显示某个方面时都会实例化它们的广告。。。