MVVM Light通过ViewModelLocator将ViewModel传递给ObjectDataProvider

时间:2015-02-20 06:52:08

标签: c# wpf mvvm mvvm-light

我有ObjectDataProvider绑定到我的viewmodel的GetProducts()方法:

<ObjectDataProvider x:Key="GetProducts"
                    ObjectType="vm:MainViewModel"
                    MethodName="GetProducts">
    <ObjectDataProvider.MethodParameters>
        <m:Subcategory Id="-1"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

据我了解,这会创建一个MainViewModel的实例来调用该方法。最近我开始使用MVVM Light,它的ViewModelLocator类注册了自己的同一个viewmodel的实例,所以现在我有两个viewmodel而不是一个。

感觉不对,所以我想知道:是否可以将ViewModelLocator创建的视图模型传递给ObjectDataProvider

我尝试使用绑定但ObjectInstance属性显然不是依赖属性,所以不能在这里使用它。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

我设法通过完全摆脱ObjectDataProvider并将一些属性添加到我的viewmodel来实现这一点,例如。

    // This property took place of MethodParameter[0]
    public Subcategory SelectedSubcategory
    {
        get { return _selectedSubcategory; }
        set
        {
            Set(() => SelectedSubcategory, ref _selectedSubcategory, value);
            RaisePropertyChanged("Products");
        }
    }

    public IEnumerable<Product> Products
    {
        get
        {
            if (SelectedSubcategory != null)
                return SelectedSubcategory.Products;
            return null;
        }
    }

我还需要更改XAML中的相应绑定,例如这样:

SelectedItem="{Binding Source={StaticResource GetProducts},
                       Path=MethodParameters[0],
                       BindsDirectlyToSource=True,
                       UpdateSourceTrigger=PropertyChanged}"

变成:

SelectedItem="{Binding SelectedSubcategory, Mode=OneWayToSource}"

现在我只有一个viewmodel实例!耶!