为什么 WPF 设计时数据过时?

问题描述 投票:0回答:1

我正在使用 Visual Studio 2022 (17.9.3),并创建了一个 .NET Framework 4.8 库项目,其中包含使用 MVVM 数据绑定到视图模型的控件,遵循如下模式:

<UserControl x:Class="WpfControls.TypeListControl"
         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:MyControlLibrary"
         xmlns:viewModels="clr-namespace:MyControlLibrary.ViewModels"
         mc:Ignorable="d" 
         d:DesignHeight="250" d:DesignWidth="200">
    <UserControl.Resources>
        <viewModels:MyViewModel x:Key="MyViewModel"/>
    </UserControl.Resources>
    <Grid d:DataContext="{Binding Source={StaticResource MyViewModel}}">
        <!-- etc.. -->
    </Grid>
</UserControl>

控件和关联的视图模型都包含在同一个项目(程序集)中。

我看到控件中显示设计时数据,但当我构建控件并构建视图模型时,我看到控件显示视图模型中的过时内容。就好像设计者正在缓存程序集,并且在我进行更改和重建时不会使其无效。

这样做的一个影响是设计者看不到新添加的类型(例如视图模型),因此 XAML 引用会触发错误。

我尝试过重新加载项目、重新加载解决方案、重新启动 Visual Studio、删除 .obj 和 .bin 文件夹、删除 .vs 文件,所有这些都没有任何影响。这让我相信 VS 设计者正在将程序集缓存在某个地方,但我不知道在哪里。如果是这种情况,该缓存位于哪里,如何清除它?

编辑:

我的解决方案包括一个使用该库的 WPF 应用程序。如果我重建应用程序,库设计视图会更新以正确显示。我看起来好像有一个缓存可以通过应用程序构建正确地失效,但不能通过组件程序集的构建正确地失效。

c# wpf visual-studio design-time
1个回答
0
投票

以下方法可能有助于解决您的问题。如果还有问题,请分享项目结构和完整的代码,可以重现您的问题,以便我分析。

方法一:

<UserControl x:Class="WpfControlLibrary1.UserControl1"
 ...
 xmlns:viewModels="clr-namespace:WpfControlLibrary1.ViewModels" >
<UserControl.DataContext>
<viewModels:ViewModel /> 
   </UserControl.DataContext>

<Grid > <DataGrid ItemsSource="{Binding Users}"  AutoGenerateColumns="False"  >

<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Id}"/>... 
</DataGrid.Columns> 

</DataGrid> </Grid></UserControl>

方法2:

<UserControl x:Class="WpfControlLibrary1.UserControl1"
          ...
             xmlns:local="clr-namespace:WpfControlLibrary1"
              xmlns:viewModels="clr-namespace:WpfControlLibrary1.ViewModels"
             d:DataContext="{d:DesignInstance viewModels:ViewModel}"  >

    <Grid >
        <DataGrid ItemsSource="{Binding Users}"  AutoGenerateColumns="False"  >
            <DataGrid.Columns>
           ...
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

   
</UserControl>

 public partial class UserControl1 : UserControl
 {
     public UserControl1()
     {
         InitializeComponent();
         DataContext = new ViewModel();
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.