WPF MVVM Lights - 具有不同参数的相同用户控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF MVVM Lights - 具有不同参数的相同用户控件相关的知识,希望对你有一定的参考价值。

我有一个使用MVVM Light的WPF应用程序。 一个MainView(+ MainViewModel)和一个用户控件(+ UCViewModel)。 该应用程序将具有带有2个Tab项的Tab控件。 每个选项卡都有一个用户控件(相同的用户控件)。 用户控制作业:加载文件内容,显示内容(并允许用户将其导出为其他格式)。 当应用程序启动时,我将读取一个配置文件,并将文件位置(从配置文件)传递给每个用户控件(例如:File1Path,File2Path)。 我可以使用MVVM Light Messenger.Default.Send来完成这项工作(从MainViewModel到UCViewModel)。 我的问题是:如何区分哪个用户控件将获取哪个文件路径? 我在SimpleIoc.Default.Register中使用ViewModelLocator来注册我的MainViewModel和UCViewModel。 在注册时,我还没有来自Config文件的数据,所以我无法将其传递给UCViewModel。

我的问题的任何评论/解决方案?

答案

方法1(使用mm8的方式) 根据@ mm8建议,我最终将MainViewModel类中每个UserControl用法的DataContext声明为Properties。 示例(在MainView xaml中):

<v:UC Grid.Row="0" HorizontalAlignment="Stretch" Margin="10" DataContext="{Binding UC2DC}" />

但是,为了让我支持我的设计时间XAML intelliense支持,我仍然使用默认的MVVM Light方式的DataContext绑定。

示例:在ViewModelLocator中,

static ViewModelLocator()
{
    ....
    SimpleIoc.Default.Register<MainViewModel>();
    SimpleIoc.Default.Register<UCViewModel>();
    ....
}

public UCViewModel CM
{
    get
    {
        return ServiceLocator.Current.GetInstance<UCViewModel>();
    }
}

在MainViewModel中,

private UCViewModel _uC2DC;

public UCViewModel UC2DC
{
    get { return _uC2DC; }
    set { Set(ref _uC2DC, value); }
}

private UCViewModel _uC1DC;

public UCViewModel UC1DC
{
    get { return _uC1DC; }
    set { Set(ref _uC1DC, value); }
}

在我的MainViewModel中的某个地方,我需要创建新实例并放入这些属性。 当我完成所有操作后,我将删除/注释掉用户控件默认的MVVM Light DataContext绑定,ViewModelLocator的SimpleIoc Register和GetInstance属性等,它将更改为我的MainView数据绑定。 我不太确定它是否可以使用MVVM方式,但截至目前,它解决了我的问题。

方法2(使用Marco的方式) 在Marco示例代码之后,我开始知道我们可以使用键来注册ViewModel的多个实例以区分它们,并且在调用属性时,使用该键来提取正确的。 以下是代码......

对于ViewModelLocator

static ViewModelLocator()
{
    ...
    SimpleIoc.Default.Register<MainViewModel>();
    SimpleIoc.Default.Register(() => new UCViewModel(), "1");
    SimpleIoc.Default.Register(() => new UCViewModel(), "2");
    ...
}

public UCViewModel UCVM1
{
    get
    {
        return ServiceLocator.Current.GetInstance<UCViewModel>("1");
    }
}

public UCViewModel UCVM2
{
    get
    {
        return ServiceLocator.Current.GetInstance<UCViewModel>("2");
    }
}

在我的MainView XAML中

<TabControl>
    <TabItem Header="Test 1">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="70"/>
                <RowDefinition Height="70"/>
            </Grid.RowDefinitions>
            <v:UC Grid.Row="0" HorizontalAlignment="Stretch" Margin="10" 
                DataContext="{Binding UCVM1,Source={StaticResource Locator}}" />
            ...
            ...
        </Grid>
    </TabItem>
    <TabItem Header="Test 2">
        <Grid Background="AliceBlue">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="70"/>
                <RowDefinition Height="70"/>
            </Grid.RowDefinitions>
            <v:UC Grid.Row="0" HorizontalAlignment="Stretch" Margin="10" 
                DataContext="{Binding UCVM2,Source={StaticResource Locator}}" />
            ...
            ...
        </Grid>
    </TabItem>
</TabControl>

对于这种方法,它仍然是相同的,对于设计时,我们不能绑定到一个默认的DataContext。可能这是给予和采取这种情况。

以上是关于WPF MVVM Lights - 具有不同参数的相同用户控件的主要内容,如果未能解决你的问题,请参考以下文章

MVVM + WPF - 为具有多个视图的 ViewModel 设计

具有多个图像的 WPF DataGrid RowDetailsTemplate (MVVM)

使用 Microsoft.Toolkit.Mvvm 和 Microsoft.Xaml.Behaviors.Wpf 将事件参数传递给命令

如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择

绑定到两个不同视图的数据源。 MVVM,WPF

WPF 利用附加属性创建FreezableCollection集合和反射实现控件参数以MVVM模式传递