gpt4 book ai didi

c# - WPF 用户控件 : Invoke usercontrol's public method from viewModel

转载 作者:行者123 更新时间:2023-12-03 10:57:18 25 4
gpt4 key购买 nike

我在 C#、NET 3.5 和 Visual Studio 2008 中有一个 MVVM WPF 应用程序。

从应用程序主 xaml 我导入用户控件。

这个用户控件有一些公共(public)方法,有两个我感兴趣。

一种启动动画的方法和另一种停止它的方法。

从代码隐藏 (xaml.cs) 中的 View 构造函数中,我调用用户控件公共(public)方法来启动动画以将其显示给用户,同时我将一些数据加载到 ListView 中的 GridView 中。加载数据的方法在我的 View 模型中调用。

所以现在,当加载任务完成时,我需要调用另一个用户控件公共(public)方法来停止动画,但我不知道如何从我的 View 模型中执行此操作。

有任何想法吗?我无法触摸用户控件,因为这不是我的。

下面是一段代码。

XAML :

xmlns:controlProgress="clr-namespace:Common.XAML.Controls.Progress;assembly=Common.XAML"

<controlProgress:Progress x:Name="Progress"
Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="150"
CustomText="Loading...">

代码隐藏 (xaml.cs):
    public MyView(ViewModelSession vm)
: base(vm)
{
InitializeComponent();

Progress.StartAnimation();
}

查看型号:
    public MyViewModel(Session session)
: base(session)
{
this.LoadDataIntoGridView();
}

最佳答案

您可以使用 INotifyPropertyChanged接口(interface)例如创建一个 ViewModelBase

public class ViewModelBase
: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

然后你将它用于你的 ViewModel 并添加一个 Property IsLoading
 public class MyViewModel : ViewModelBase
{
private bool _isLoading;

public bool IsLoading
{
get { return _isLoading; }
set
{
if(_isLoading == value) return;
_isLoading = value;
OnPropertyChanged();
}
}

然后在您的 View Codebehind 中使用 ViewModel 的 PropertyChanged 事件来启动/停止动画。

然后您可以在 ViewModel 中设置 bool 以开始停止关闭动画
在你看来

更新
public class MyView
{
private readonly MyViewModel _viewModel;

public MyView(MyViewModel viewModel)
: base(viewModel)
{
InitializeComponent();
_viewModel = viewModel;
_viewModel.PropertyChanged +=OnPropertyChanged;
}

private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(MyViewModel.IsLoading))
{
if (_viewModel.IsLoading)
{
Progress.StartAnimation();
}
else
{
Progress.StopAnimation();
}
}
}
}

关于c# - WPF 用户控件 : Invoke usercontrol's public method from viewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45216091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com