为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
波斯汪 2022-12-31 10:27:02
我按照一些在线教程在 ListView 的动态视图之间切换。在我的主窗口中,我在左窗格中有一个 ListView,其中包含子 ViewModel 列表的 ItemsSource。(每个子 ViewModel 实现一个接口)每个 ViewModel 都有自己的视图作为数据模板。我正在从 MainWindow 调用所选视图的 GenerateReport() 方法。但是所选视图的值变为空。从Github下载我的源代码。重现问题的步骤:运行应用程序并在学生报告的 ID 和名称中键入文本。(StudentReportViewModels 属性中的断点正确命中并更新了值。)然后单击生成报告按钮。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>
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您的 StudentsReport.xaml UserControl 绑定到在 XAML 中创建的 StudentsReportViewModel 实例:


<UserControl.DataContext>

    <vm:StudentsReportViewModel/>

</UserControl.DataContext>

然而,“生成报告”按钮正在调用在 MainWindowVieModel 构造函数中创建并存储在 Report 类中的 StudentsReportViewModel 的另一个实例。


Reports = new List<Report>

{

    new Report{ Name = "Students Report", ViewModel = new StudentsReportViewModel()},

    new Report{ Name = "Marks Report", ViewModel = new MarksReportViewModel()}

};

您需要删除其中一个实例,以便将 UserControl 的 DataContext 绑定到您从中生成报告消息的同一视图模型实例。我建议从 StudentsReport.xaml 中删除这段代码:


<UserControl.DataContext>

    <vm:StudentsReportViewModel/>

</UserControl.DataContext>


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信