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 将事件参数传递给命令