【问题标题】:How do you access the MainViewModel in ViewModelLocator from code behind?如何从后面的代码访问 ViewModelLocator 中的 MainViewModel?
【发布时间】:2023-03-17 10:13:01
【问题描述】:

为我的视图模型使用 MVVM 灯光构建 WP7 应用程序。我正在使用通过 NuGet 添加库时添加的 ViewModelLocator。效果很好,但现在我需要从代码中访问 ViewModel。

在我的代码中,用户单击一个按钮,我需要搜索 MainViewModel(其中包含多个视图模型)并根据用户输入的条件找到一个。

通常我只会响应按钮的 Click 事件,但我没有 ViewModelLocator 类的实例变量来获取 MainViewModel 以执行搜索。使用 Windows Phone 7 的默认模板(非 MVVMLight),App 类具有主视图模型的静态变量,因此您可以随时使用 App.ViewModel 访问它。

twitter 上有一些关于使用命令的讨论,这会很好,但有时我必须跨多个虚拟机执行代码搜索才能获得我需要的结果。可能需要将 ISearchViewModel 服务注入 View 或其他东西才能使其工作。

这里是提供的 ViewModelLocator 的实现:

public class ViewModelLocator
{
    private static MainViewModel _main;

    public ViewModelLocator()
    {
        _main = new MainViewModel();
    }

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

那么从另一个视图后面的代码中,您如何访问 Main(MainViewModel 包含所有数据列表并有我调用的搜索方法)?还是应该?

只是想知道人们是如何解决这类问题的?

谢谢。

【问题讨论】:

  • 我不确定这会如何影响您的应用程序或 MVVM-Light 结构或代码,但我遵循 WP 的默认实现并将我的所有 ViewModel 创建为静态,然后根据需要从应用类。 -再次不确定这将如何与您的特定项目设置一起使用。
  • 是的,默认设置将它们全部创建为静态的,这很好,但 ViewModelLocator 类(它提供了用于设计和运行时的 VM 的可混合性)不是静态类并且没有静态视图模型。

标签: windows-phone-7 mvvm-light


【解决方案1】:

在 MVVM-Light 中,ViewModelLocator 作为应用程序资源提供。因此您仍然可以直接访问它,但语法不同。如果您查看您的 App.xaml,您应该会在某处看到这段代码。

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

您可以从应用程序的任何位置访问应用程序的资源,因此也可以使用这段代码访问 MainViewModel:

(App.Current.Resources["Locator"] as ViewModelLocator).Main

这适用于任何应用程序资源。

【讨论】:

    【解决方案2】:

    如果您像在模板中一样创建了 ViewModelLocator,则您拥有对 ViewModel 的静态引用。 mvvmlocatorproperty-sn-p 像这样创建 ViewModel-properties。 这意味着您只需实例化一个新的 ViewModelLocator 即可在按钮单击后的代码中定位 ViewModel。它始终是相同的视图模型,独立于 ViewModelLocator 的不同实例

    【讨论】:

    • 调查这个。 sn-p 输出与您创建新项目时获得的输出不匹配,因此我可能需要稍微调整一下。您在定位器中创建的每个 ViewModel 都有一个静态引用,因此这可能会起作用。今晚晚些时候回来看看是否有。
    • 刚刚检查过,一旦正确的代码与 ViewModelLocator 一起到位,那么 Martin 是正确的。创建 ViewModelLocator 的任何实例都允许您访问它的静态属性,同时保持它在设计模式下的可混合性。
    【解决方案3】:

    要从您的代码中访问 MainViewModel,您可以将此属性添加到您的类中:

    public ViewModel.MainViewModel myContext { get { return (DataContext as ViewModel.MainViewModel); } }
    

    那么你就可以使用myContext.[whatever]

    【讨论】:

    • 这可能会起作用,先尝试使用 sn-p 调整主视图模型,但也会尝试一下。当然现在的问题是哪种技术更好?
    • 我在我的 App.xaml.cs 中使用它作为静态引用,它可以让您从任何包含应用程序 using 语句的代码隐藏文件中访问您的 MainViewmodel 实例。
    【解决方案4】:

    您可以只使用 ViewModelLocator.MainViewModelStatic。 MVVMLight 的默认模板对每个视图模型都有一个静态属性。

    【讨论】:

      猜你喜欢
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多