C# 自定义XAML绑定源类
我试图找到一种更好的方法来声明UWP XAML页面使用的ViewModel 此时此刻,C# 自定义XAML绑定源类,c#,xaml,mvvm,data-binding,uwp,C#,Xaml,Mvvm,Data Binding,Uwp,我试图找到一种更好的方法来声明UWP XAML页面使用的ViewModel 此时此刻, 我声明了一个包含数据属性的ViewModel类ViewModelClass 然后我将该类的一个实例声明为页面的StaticResource。我喜欢调用那些视图,以确保我所有页面设计的一致性 最后,我将页面的DataContext声明为与静态资源视图的绑定 这将生成一个了解正在使用的数据结构的页面,并允许在处理绑定时自动完成。不错,虽然有很多相同的代码行 只是,它并不真正适合ViewModels,因为声明的资源
ViewModelClass
StaticResource
。我喜欢调用那些视图
,以确保我所有页面设计的一致性静态资源
视图
的绑定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:keySource={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。这样,我就可以让它们处于待机状态每次我在页面中显示某个方面时都会实例化它们的广告。。。