gpt4 book ai didi

xaml - UserControl 上的 MVVMLight ViewModelLocator

转载 作者:行者123 更新时间:2023-12-02 00:55:40 24 4
gpt4 key购买 nike

是否可以在 UserControl 上使用 MVVMLight ViewModelLocator。我已将其添加到我的用户控件中,方式与在主窗口上相同,但我在 VS2010 中收到错误/弹出窗口,指出“找不到名为“定位器”的资源。资源名称区分大小写。”

有人试过这个吗?

到目前为止,我的代码几乎是一个标准的 MVVMLight WPF 入门应用程序...

用户控制

<UserControl x:Class="NavTest3.PersonControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Height="116" MinWidth="250" Width="300"
DataContext="{Binding Person, Source={StaticResource Locator}}"
>

<!---->
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

App.xaml 包含..

<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
</Application.Resources>

所以问题在于在 userControl 上设置“DataContext=”{Binding Person, Source={StaticResource Locator}}”。”

如上所述,这样做意味着该用户控件的每个实例都将共享相同的 ViewModel,但我想在继续之前先了解这个问题..

最佳答案

是的,您可以,您需要在用户控件中创建静态资源

<UserControl x:Class="MvvmLight1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"

xmlns:vm="clr-namespace:MvvmLight1.ViewModel"
>

<UserControl.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</UserControl.Resources>
<Grid>

</Grid>
</UserControl>

但在我看来,对 UserControles 使用 MVVM Light ViewModelLocator 并不是一个好主意,因为它是一个静态属性,当您要实例化用户控件的多个实例时,将具有相同的通用 ViewModel,因此它们的行为都是相同的如果您决定在整个项目中使用一次 UserControl,这不是我们想要的。

要解决此问题,您需要修改 ViewModelLocator,例如将所有属性设置为非静态:

 public class ViewModelLocator
{
// v--- You got to comment this out
private /*static*/ MainViewModel _main;

public ViewModelLocator()
{
CreateMain();
}

public /*static*/ MainViewModel MainStatic
{
get
{
if (_main == null)
{
CreateMain();
}

return _main;
}
}

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public MainViewModel Main
{
get
{
return MainStatic;
}
}

public /*static*/ void ClearMain()
{
_main.Cleanup();
_main = null;
}

public /*static*/ void CreateMain()
{
if (_main == null)
{
_main = new MainViewModel();
}
}

public /*static*/ void Cleanup()
{
ClearMain();
}
}

关于xaml - UserControl 上的 MVVMLight ViewModelLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6329033/

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