我在我的项目中使用 MVVM 模式。它使用的是代码隐藏。
我遇到的问题是:我的项目中包含一个从 Simple WPF Page transitions 下载的页面转换控件。 .
它在代码隐藏中效果很好,xaml 如下:
<Grid ShowGridLines="False">
<pageTransitions:PageTransition Name="pageTransitionControl" Margin="0" TransitionType="GrowAndFade" />
</Grid>
在窗口标签中使用此内容:
xmlns:pageTransitions="clr-namespace:WpfPageTransitions;assembly=WpfPageTransitions"
在我刚刚运行的代码隐藏中:
mast.Page mp = new mast.Page();
pageTransitionControl.ShowPage(mp);
当我执行以下代码隐藏时,它会卸载当前页面(mp)并加载新页面(dp)
dist.Page dp = new dist.Page();
pageTransitionControl.ShowPage(dp);
上面的“mp”和“dp”是用户控件(页面)的新实例。 pageTransitionControl 是 xaml 中转换控件的名称。
现在我想让它通过 ViewModel 运行,而不像上面那样与 View 进行通信,我该怎么做?
最佳答案
理想情况下,PageTransition
控件将为您提供一种通过绑定(bind)设置当前页面的方法。假设它没有提供这样做的方法,那么有很多方法可以实现这一点。
这里有三个建议,按照“好坏”的顺序(我认为)。
您可以创建一个新的页面转换控件,它可以是
PageTransition
的包装器,也可以继承它。然后将当前页面的DependecyProperty
添加到您可以绑定(bind)的类,捕获 dependentecy 属性更改事件并调用ShowPage
。根据使用情况编写一个继承
FrameworkElement
或DependencyObject
的类,该类可以绑定(bind)到页面和PageTransition
控件。然后,该类负责在当前页面更改时调用绑定(bind)的PageTransition
控件上的ShowPage
。将
PageTransition
控件绑定(bind)到模型上的属性,并让模型中的代码通过该属性访问该控件。
示例:
public class MyPageTransition : ContentControl
{
public static readonly DependencyProperty CurrentPageProperty =
DependencyProperty.Register(
"CurrentPage",
typeof(object),
typeof(MyPageTransition),
new PropertyMetadata(DependencyPropertyChanged));
public ContentControl()
{
this.Content = this.pageTransition;
}
public object CurrentPage
{
get { return GetValue(CurrentPageProperty); }
set { SetValue(CurrentPageProperty, value); }
}
protected static void DependencyPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (e.Property == CurrentPageProperty)
{
this.pageTransition.ShowPage(CurrentPage);
}
}
private PageTransition pageTransition = new PageTransition();
}
关于c# - 如何通过 ViewModel 调用自定义控件上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20288976/