在 WinUI3 项目中,下面的 XAML
ListView
代码工作得很好,UserHomeView
中的 UI 被生成,所有依赖于 UserHomeViewModel
的属性和进程都被触发和更新。
<ListView>
<ListViewItem>
<userHomeViews:UserHomeView Height="200"
Width="300"
UserHomeViewModel="{x:Bind WindowConfiguratorViewModel.KioskCollection[0].UserHomeViewModel}" />
</ListViewItem>
</ListView>
当我将
UserHomeView
移动到 DataTemplate
中以自动生成 KioskCollection
中的所有项目时,它正确显示 UserHomeView
的 UI 次数与 KioskCollection
中的项目一样多,但 UserHomeViewModel
属性不正确绑定在任何生成的项目中,并在所有项目中显示为 null
,因此,每个项目生成的 UI 完全无法使用。
<ListView ItemsSource="{x:Bind WindowConfiguratorViewModel.KioskCollection, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="viewModelsConfigurator:ProfileKioskDesktopViewModel">
<userHomeViews:UserHomeView Height="200"
Width="300"
UserHomeViewModel="{x:Bind UserHomeViewModel}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我在应用程序的几个部分中重复使用了
UserHomeView
,并且仅当放置在 DataTemplate
内时才会失败。我已经在 ListView
和 GridView
中进行了测试,并且都提供了相同的结果。
当放置在
DataTemplate
中的 ListBox
内时,它工作得非常好,UserHomeViewModel
属性已正确绑定,并且每个项目的最终 UI 都完全可用。
<ListBox ItemsSource="{x:Bind WindowConfiguratorViewModel.KioskCollection, Mode=OneWay}">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="viewModelsConfigurator:ProfileKioskDesktopViewModel">
<userHomeViews:UserHomeView Height="200"
Width="300"
UserHomeViewModel="{x:Bind UserHomeViewModel}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
但是,我实际需要的控件是
GridView
,它目前提供与ListView
相同的不成功结果。我假设它与 GridView/ListView
的工作方式有关,并且与 ListBox
不同,但我不明白/不知道它是什么。有谁知道为什么会发生这种情况?我真的希望能够使用 GridView
而不是 ListBox
。
注意: 我使用
ListView
作为示例,因为 GridView
在创建模板时更加冗长,但本质上,它是完全相同的。
确保您的用户控件中的 DependencyProperty 是
public static read-only
属性。
public int SomeValue
{
get => (int)GetValue(SomeValueProperty);
set => SetValue(SomeValueProperty, value);
}
public static readonly DependencyProperty SomeValueProperty =
DependencyProperty.Register(
nameof(SomeValue),
typeof(int),
typeof(UserControl1),
new PropertyMetadata(default));