使用MvvmLight如何向ViewModel传递参数

MvvmLight是个很好的编程框架,使用方便,但如果不熟练也会有许多难以解决的问题。就比如不知道如何向ViewModel传递参数。在网上也有不少这样的问题,解答往往是使用它提供的Messenger,有方便之处,也有不便之处。比如,我要根据参数来获取数据库数据,那么势必要先做清空,再获取新数据,可能有别的绑定或私有字段进行相应的更改,造成不少麻烦,也有可能弄不好。不同类型的数据使用同一个View,获取不同类型数据的是ViewModel的任务,而MvvmLight框架直接将ViewModel作为DataContext绑定到View,这里没有涉及到参数的传递动作。经过探索,其实,参数是可以传递的,它不在绑定动作里传递,而在其它2个地方进行一下改变编程。如下:
一、简单做一个Wpf桌面解决方案,导入MvvmLight框架。
二、编写一个带构造函数参数的ViewModel:
    public class EditViewModel : ViewModelBase
    {
        public EditViewModel(string text)
        {
            Text = text;
        }
        private string text;

        public string Text { get => text; set { text = value; RaisePropertyChanged("Text"); } }
    }
三、更改MainViewModel类,这里以字符串作为参数。
        public MainViewModel()
        {
            MyContent = new Border();
        }
        public Border MyContent { get; set; }

        private string myString;
        private List<string> list;

        public string MyString
        {
            get => myString;
            set
            {
                if (myString != value)
                {
                    myString = value;
                    MyContent.Child = new EditView();
                    RaisePropertyChanged("MyString");
                }
            }
        }
        public List<string> ListString
        {
            get
            {
                if (list == null)
                {
                    list = new List<string>
                    {
                        "第一个数据",
                        "第二个数据",
                        "第三个数据",
                        "第四个数据",
                        "第五个数据"
                    };
                }
                return list;
            }
        }
        public EditViewModel GetEditViewModel()
        {
            return new EditViewModel(MyString);
        }
这里可以看到,参数就在这里传递。
MyContent.Child = new EditView();
这一句是没有参数传递动作的,也就是说View没有参数传递的功能。
四、关键一步是在ViewModelLocator类里添加属性。
        public EditViewModel Edit
        {
            get
            {
                return Main.GetEditViewModel();
            }
        }
因为MainViewModel已经注册了,而EditViewModel是从MainViewModel类的Main对象中获取的,所以EditViewModel不用再专门注册,否则会有错误提示已经注册了
五、测试一下:
<UserControl x:Class="WpfApp.MvvmLight.View.EditView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" DataContext="{Binding Source={StaticResource Locator}, Path=Edit}"
             d:DesignHeight="30" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="{Binding Text}" Height="25" FontSize="18"></TextBlock>
    </Grid>
</UserControl>
<Window x:Class="WpfApp.MvvmLight.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ComboBox Height="25" Width="140" ItemsSource="{Binding ListString}" SelectedItem="{Binding MyString}"></ComboBox>

        <ContentControl Content="{Binding MyContent}" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></ContentControl>
    </Grid>
</Window>







展开阅读全文

没有更多推荐了,返回首页