Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 7 如何从代码隐藏中访问ViewModelLocator中的MainViewModel?_Windows Phone 7_Mvvm Light - Fatal编程技术网

Windows phone 7 如何从代码隐藏中访问ViewModelLocator中的MainViewModel?

Windows phone 7 如何从代码隐藏中访问ViewModelLocator中的MainViewModel?,windows-phone-7,mvvm-light,Windows Phone 7,Mvvm Light,使用MVVM light为我的视图模型构建WP7应用程序。我使用的是ViewModelLocator,当您通过NuGet添加库时会添加它。工作得很好,但现在我需要从代码中访问ViewModel 在我的代码中,用户单击一个按钮,我需要搜索MainViewModel(其中包含多个视图模型),并根据用户输入的条件找到一个 通常我只响应按钮的Click事件,但我没有ViewModelLocator类的实例变量来获取MainViewModel以执行搜索。对于Windows Phone 7的默认模板(非MV

使用MVVM light为我的视图模型构建WP7应用程序。我使用的是ViewModelLocator,当您通过NuGet添加库时会添加它。工作得很好,但现在我需要从代码中访问ViewModel

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

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

twitter上有一些关于使用命令的讨论,这是很好的,但是在某个时候,我必须在多个虚拟机上执行代码搜索,以获得我需要的结果。可能需要向视图中注入ISearchViewModel服务或其他东西来实现这一点

以下是提供的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包含所有数据列表,并具有我调用的搜索方法)?还是你应该

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


谢谢。

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

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

然后,如果您在模板中创建了ViewModelLocator,则可以使用myContext。[任何]

对ViewModels进行静态引用。
mvvmlocatorproperty
-代码段创建如下ViewModel属性。
这意味着您可以实例化一个新的ViewModelLocator,以便在代码隐藏按钮单击中找到ViewModels。无论ViewModelLocator的不同实例如何,它始终是相同的viewmodels。在MVVM中,ViewModelLocator是作为应用程序资源提供的。因此,您仍然可以直接访问它,但语法不同。如果您查看App.xaml,您应该会在某个地方看到这段代码

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

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

您只需使用ViewModelLocator.MainViewModelStatic即可。MVVMLight的默认模板对您的每个viewmodel都有一个静态属性。

我不确定这将如何影响您的应用程序或MVVM Light结构或代码,但我遵循WP的默认实现,将所有viewmodel创建为静态,然后根据需要从App类中引用它们-同样,我不确定这将如何与您的特定项目设置配合使用。是的,默认设置会将它们全部创建为静态的,这很好,但ViewModelLocator类(它提供虚拟机在设计和运行时使用的可混合性)不是静态类,并且没有静态视图模型。对此进行研究。代码段输出与创建新项目时得到的结果不匹配,因此我可能需要稍微调整一下。在定位器中创建的每个ViewModel都有一个静态引用,因此这可能会起作用。今晚晚些时候返回查看是否正确。只需检查它,一旦使用ViewModelLocator获得正确的代码,则Martin是正确的。创建ViewModelLocator的任何实例都允许您访问它的静态属性,同时在设计模式下保持它的可混合性。这可能会起作用,首先尝试使用代码段调整主视图模型,但也会尝试这样做。当然现在的问题是哪种技术更好?我在App.xaml.cs中使用了它作为静态参考,它将允许您从任何具有应用程序using语句的代码隐藏文件访问MainViewmodel实例。
(App.Current.Resources["Locator"] as ViewModelLocator).Main