猿问

动态 ViewModel 的绑定值在 WPF 中变为空

我按照一些在线教程在 ListView 的动态视图之间切换。

  1. 在我的主窗口中,我在左窗格中有一个 ListView,其中包含子 ViewModel 列表的 ItemsSource。(每个子 ViewModel 实现一个接口)

  2. 每个 ViewModel 都有自己的视图作为数据模板。

  3. 我正在从 MainWindow 调用所选视图的 GenerateReport() 方法。但是所选视图的值变为空。

从Github下载我的源代码。

重现问题的步骤:

  1. 运行应用程序并在学生报告的 ID 和名称中键入文本。(StudentReportViewModels 属性中的断点正确命中并更新了值。)

  2. 然后单击生成报告按钮。StudentReportViewModels 的属性值变为空。

如何解决这个问题?请帮忙。

来源:MainWindow.xaml

<Window.Resources>

    <DataTemplate DataType="{x:Type vm:StudentsReportViewModel}">

        <view:StudentsReport/>

    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:MarksReportViewModel}">

        <view:MarksReport />

    </DataTemplate>

</Window.Resources>

<Window.DataContext>

    <local:MainWindowViewModel/>

</Window.DataContext>

<Grid>

    <Grid.ColumnDefinitions>

        <ColumnDefinition Width="200"/>

        <ColumnDefinition Width="Auto"/>

        <ColumnDefinition Width="*"/>

    </Grid.ColumnDefinitions>


    <ListView ItemsSource="{Binding Reports}" SelectedItem="{Binding SelectedReport, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

        <ListView.ItemTemplate>

            <DataTemplate>

                <TextBlock Text="{Binding Name}"/>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>


    <GridSplitter Grid.Row="1" Grid.Column="1" Width="5" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch"/>

    <Grid Grid.Column="2">

        <Grid.RowDefinitions>

            <RowDefinition Height="2*"/>

            <RowDefinition Height="Auto"/>

        </Grid.RowDefinitions>

        <ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">

            <ContentControl Content="{Binding SelectedReport.ViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

        </ScrollViewer>

        <Button Content="Generate Report" Grid.Row="2" Margin="5" HorizontalAlignment="Right" Command="{Binding GenerateReportCommand}"/>

    </Grid>

</Grid>


波斯汪
浏览 118回答 1
1回答

潇潇雨雨

您的 StudentsReport.xaml UserControl 绑定到在 XAML 中创建的 StudentsReportViewModel 实例:<UserControl.DataContext>&nbsp; &nbsp; <vm:StudentsReportViewModel/></UserControl.DataContext>然而,“生成报告”按钮正在调用在 MainWindowVieModel 构造函数中创建并存储在 Report 类中的 StudentsReportViewModel 的另一个实例。Reports = new List<Report>{&nbsp; &nbsp; new Report{ Name = "Students Report", ViewModel = new StudentsReportViewModel()},&nbsp; &nbsp; new Report{ Name = "Marks Report", ViewModel = new MarksReportViewModel()}};您需要删除其中一个实例,以便将 UserControl 的 DataContext 绑定到您从中生成报告消息的同一视图模型实例。我建议从 StudentsReport.xaml 中删除这段代码:<UserControl.DataContext>&nbsp; &nbsp; <vm:StudentsReportViewModel/></UserControl.DataContext>
随时随地看视频慕课网APP
我要回答