x:绑定自定义控件属性时,Bind 在 DataTemplate 内不起作用

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

在 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
在创建模板时更加冗长,但本质上,它是完全相同的。

c# xaml winui-3 windows-app-sdk
1个回答
0
投票

确保您的用户控件中的 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));
© www.soinside.com 2019 - 2024. All rights reserved.