我有以下虚拟应用程序,我正在尝试使用两个视图构建主细节。第一个是集合视图,我可以成功选择它的元素,它显示在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>
答案 0 :(得分:2)
您需要从prism:ViewModelLocator.AutoWireViewModel="True"
删除TextView
属性。
它的作用是从容器中提取适当的视图模型,并将视图模型分配给TextView.DataContext
。另一方面,在模板中,您没有将模板化数据显式传递给TextView
控件,因此可以通过DataContext
的自动继承继承它。但这不起作用,因为TextView.DataContext
由prism:ViewModelLocator.AutoWireViewModel="True"
显式设置。
如果需要使用视图模型自动布线,您始终可以从引用范围设置此属性,即在您的视图被“使用”的XAML中,例如:
<StackPanel>
<views:TextView prism:ViewModelLocator.AutoWireViewModel="True" />
</StackPanel>