c# - 如何通过 ViewModel 调用自定义控件上的方法

标签 c# wpf mvvm viewmodel

我在我的项目中使用 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)设置当前页面的方法。假设它没有提供这样做的方法,那么有很多方法可以实现这一点。

这里有三个建议,按照“好坏”的顺序(我认为)。

  1. 您可以创建一个新的页面转换控件,它可以是 PageTransition 的包装器,也可以继承它。然后将当前页面的 DependecyProperty 添加到您可以绑定(bind)的类,捕获 dependentecy 属性更改事件并调用 ShowPage

  2. 根据使用情况编写一个继承 FrameworkElementDependencyObject 的类,该类可以绑定(bind)到页面和 PageTransition 控件。然后,该类负责在当前页面更改时调用绑定(bind)的 PageTransition 控件上的 ShowPage

  3. 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/

相关文章:

c# - 监听 XAML 中的全局变量变化

C# 枚举反向索引

c# - 如何忽略 String.ToUpper() 中的撇号?

c# - WPF 更改 ListBox 背景颜色,启用和禁用

wpf - mvvm中的businesslogic

c# - 通过 3D 投影从图像中获取纹理

wpf - 在控制上调用 "function"

wpf - 如何将 View 中控件的 UI 调度程序传递给 ViewModel

c# - 从 C# 将数组发送到 php

C# Windows 窗体显示 Facebook 评论