【问题标题】:Master Detail MVVM with Prism and XAML binding view in data context数据上下文中具有 Prism 和 XAML 绑定视图的 Master Detail MVVM
【发布时间】:2016-01-06 04:54:10
【问题描述】:

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

我尝试将 TextBlock 和 TextBox 移出视图,但未能成功使其显示数据。如果我删除 TB 并取消注释视图,它将显示视图,但视图中的 TB 不会填充。

当然,我的想法是我将拥有不止一种类型。

主窗口

<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>

文本视图

<UserControl x:Class="MyApp.Views.TextView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MyApp.Views"
         xmlns:viewModel="clr-namespace:MyApp.ViewModels"
         mc:Ignorable="d" 
         xmlns:prism="http://prismlibrary.com/" 
         prism:ViewModelLocator.AutoWireViewModel="True"
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <StackPanel>
        <TextBlock Text="Text Item"/>
        <TextBlock Text="{Binding Name}"></TextBlock>
        <TextBox Text="{Binding Text}"></TextBox>
    </StackPanel>
</Grid>

【问题讨论】:

  • 我认为项目没有进入“myItemCollection.SelectedViewModel”首先检查这个。
  • 我会先从您的TextView 中删除prism:ViewModelLocator.AutoWireViewModel="True" - 数据上下文需要在您的DataTemplate 中继承才能使绑定起作用。
  • @Grx70 这似乎奏效了。如果你想把它变成一个答案,我会接受它。

标签: c# wpf xaml mvvm prism


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2017-09-24
    • 2012-01-23
    • 2016-09-08
    • 2022-01-23
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多