使用AvalonDock注入实例化的ViewModel以进行查看

时间:2013-08-20 06:54:05

标签: mvvm dependency-injection unity-container avalondock constructor-injection

我有一个Observable ViewModels集合,它绑定到AvalonDock的LayoutItemTempate。当用户从提取的列表中打开问题时,它会在可观察集合中创建一个新的ViewModel。结果创建了一个新文档,但它是新文档,不使用集合中的ViewModel。

我尝试使用转换器,但似乎根本没有使用转换器。有没有人知道另一种选择?甚至可能是代码隐藏解决方案?

以下是主要的XAML代码段。 。

 <Window.Resources>
    <pconv:IProblemInfoToFreeResponseVMConverter x:Key="FreeResponseToVM" />
</Window.Resources>
. . . { some lines down } . .  .
<dock:DockingManager.LayoutItemTemplateSelector>
    <selector:LayoutItem>
        <selector:LayoutItem.ProblemEditViewTemplate>
            <DataTemplate>
                <problem:FreeResponseEdit 
                    DataContext="{Binding SelectedProblem,
                        Converter={StaticResource FreeResponseToVM}}" />
            </DataTemplate>
        </selector:LayoutItem.ProblemEditViewTemplate>
    </selector:LayoutItem>
</dock:DockingManager.LayoutItemTemplateSelector>

我的转换器代码。 。

[ValueConversion(typeof(FreeResponse), typeof(FreeResponseEditViewModel))]
public class IProblemInfoToFreeResponseVMConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is FreeResponse)
            return new FreeResponseEditViewModel(value as FreeResponse);
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is FreeResponseEditViewModel)
            return (value as FreeResponseEditViewModel).ProblemItem;
        return value;
    }
}

1 个答案:

答案 0 :(得分:2)

ItemSource绑定到FreeResponseEditViewModel堆栈,DataTemplate创建FreeResponseEdit,然后自动将FreeResponseEditViewModel作为DataContext注入到视图中。

<dock:DockingManager.LayoutItemTemplateSelector>
    <selector:LayoutItem>
        <selector:LayoutItem.ProblemEditViewTemplate>
            <DataTemplate>
                <problem:FreeResponseEdit /> 
            </DataTemplate>
        </selector:LayoutItem.ProblemEditViewTemplate>
    </selector:LayoutItem>
</dock:DockingManager.LayoutItemTemplateSelector>

完全省略DataContext