在数据上下文中使用Prism和XAML绑定视图的主细节MVVM

时间:2016-01-06 04:54:11

标签: c# wpf xaml mvvm prism

我有以下虚拟应用程序,我正在尝试使用两个视图构建主细节。第一个是集合视图,我可以成功选择它的元素,它显示在Content Presenter数据模板中,TextBlock和TextBox定义如下。

我试图将TextBlock和TextBox移到视图中,但是在获取它以显示数据方面却没有成功。如果我删除TB并取消注释视图,它将显示视图,但视图中的TB将不会填充。

当然,我的想法是我将拥有多种类型。

主窗口

#
# Database access functions for the web forum.
# 

import psycopg2

## Database connection

def GetAllPosts():
    DB = psycopg2.connect("dbname=forum")
    c = DB.cursor()
    c.execute("SELECT time, content FROM posts ORDER BY time DESC")
    posts = ({'content': str(row[1]), 'time': str(row[0])}
             for row in c.fetchall())

    # This returns a dictionary -- returning just c.fetchall() will return a list of tuples

    DB.close()
    return posts

def AddPost(content):
    DB = psycopg2.connect("dbname=forum")
    c = DB.cursor()
    c.execute("INSERT INTO posts (content) values ('%s')" % content)
    DB.commit()
    DB.close()

的TextView

<Window x:Class="MyApp.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:views="clr-namespace:MyApp.Views"
    mc:Ignorable="d"
    xmlns:prism="http://prismlibrary.com/" 
    xmlns:viewModel="clr-namespace:MyApp.ViewModels"
    prism:ViewModelLocator.AutoWireViewModel="True"
    Title="MainWindow" Height="350" Width="525">
<Grid x:Name="LayoutRoot">
    <StackPanel Orientation="Horizontal">
        <views:CollectionView DataContext="{Binding myItemCollection}">
        </views:CollectionView>
        <ContentPresenter x:Name="Detail" Content="{Binding myItemCollection.SelectedViewModel}">
            <ContentPresenter.Resources>
                <DataTemplate DataType="{x:Type viewModel:TextViewModel}">
                    <StackPanel>
                        <TextBlock Text="{Binding Name}"></TextBlock>
                        <TextBox Text="{Binding Text}"></TextBox>
                        <!--<views:TextView/>-->
                    </StackPanel>
                </DataTemplate>
            </ContentPresenter.Resources>
        </ContentPresenter>
    </StackPanel>
</Grid>

1 个答案:

答案 0 :(得分:2)

您需要从prism:ViewModelLocator.AutoWireViewModel="True"删除TextView属性。

它的作用是从容器中提取适当的视图模型,并将视图模型分配给TextView.DataContext。另一方面,在模板中,您没有将模板化数据显式传递给TextView控件,因此可以通过DataContext的自动继承继承它。但这不起作用,因为TextView.DataContextprism:ViewModelLocator.AutoWireViewModel="True"显式设置。

如果需要使用视图模型自动布线,您始终可以从引用范围设置此属性,即在您的视图被“使用”的XAML中,例如:

<StackPanel>
    <views:TextView prism:ViewModelLocator.AutoWireViewModel="True" />
</StackPanel>