我有一个使用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。
我的问题的任何评论/解决方案?
答案 0 :(得分:0)
方法1(使用mm8' s方式)
根据@ mm8建议,我最终将MainViewModel类中每个UserControl用法的DataContext声明为属性。
示例(在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。对于这种情况,可能是给予和接受。