我正在使用 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 应用程序。如果我重建应用程序,库设计视图会更新以正确显示。我看起来好像有一个缓存可以通过应用程序构建正确地失效,但不能通过组件程序集的构建正确地失效。
以下方法可能有助于解决您的问题。如果还有问题,请分享项目结构和完整的代码,可以重现您的问题,以便我分析。
方法一:
<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();
}
}