如何获取对ViewModel的引用

时间:2013-07-22 20:20:13

标签: c# wpf mvvm viewmodel

全部,我有一个自定义DataGridView控件,可以覆盖DataGidView的{​​{1}}事件。在此事件中,我需要获取相关ViewModel中数据集的引用。代码是

OnItemsSourceChanged

在标记的行上,我想知道如何获取对public class ResourceDataGrid : DataGrid { protected override void OnItemsSourceChanged( System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue) { if (Equals(newValue, oldValue)) return; base.OnItemsSourceChanged(oldValue, newValue); ResourceCore.ResourceManager manager = ResourceCore.ResourceManager.Instance(); ResourceDataViewModel resourceDataViewModel = ?? // How do I get my ResourceDataViewModel List<string> l = manger.GetDataFor(resourceDataViewModel); ... } } 的引用。我的共同点是,我有多个标签,每个标签包含一个数据网格和相关的ViewModel,ViewModel保存了一些我需要检索的数据[通过ResourceDataViewModel resourceDataViewModel](还是有另一种,更好的方式?)。

问题是,从上面的事件中,我如何得到ascociated ResourceManager

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

获取DataContext并将其转换为视图模型类型:

var viewModel = this.DataContext as ResourceDataViewModel

答案 1 :(得分:1)

在您的应用上添加静态引用,创建VM时将其引用放在静态上并根据需要访问它。

答案 2 :(得分:1)

你问是否有更好的方法...根据我的经验,如果你发现自己在WPF中继承了UI元素,那么通常就是。

通过将整个选项卡控件数据绑定到视图模型,您可以远离嵌入业务逻辑(选择要在网格中显示的数据)。

要演示 - 这是一个非常简单的例子。这是我托管标签控件的窗口的XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header" Value="{Binding TabName}"></Setter>
                </Style>
            </TabControl.ItemContainerStyle>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <DataGrid ItemsSource="{Binding TabData}"></DataGrid>
                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

我的窗口的数据上下文是TabsViewModel(我使用的是NotificationObject,可以在PRISM NuGet包中找到):

public class TabsViewModel: NotificationObject
{
    public TabsViewModel()
    {
        Tabs = new[]
            {
                new TabViewModel("TAB1", "Data 1 Tab 1", "Data 2 Tab1"), 
                new TabViewModel("TAB2", "Data 1 Tab 2", "Data 2 Tab2"), 
            };
    }

    private TabViewModel _selectedTab;
    public TabViewModel SelectedTab
    {
        get { return _selectedTab; }
        set
        {
            if (Equals(value, _selectedTab)) return;
            _selectedTab = value;
            RaisePropertyChanged(() => SelectedTab);
        }
    }

    public IEnumerable<TabViewModel> Tabs { get; set; } 
}

public class TabViewModel
{
    public TabViewModel(string tabName, params string[] data)
    {
        TabName = tabName;
        TabData = data.Select(d => new RowData(){Property1 = d}).ToArray();
    }
    public string TabName { get; set; }
    public RowData[] TabData { get; set; }
}

public class RowData
{
    public string Property1 { get; set; }
}

这显然是一个过于简化的情况,但它意味着如果有任何关于在每个选项卡中显示哪些数据的业务逻辑,这可以驻留在一个视图模型中,而不是后面的代码。这为MVVM提供了所有“关注点分离”的好处......