如何以编程方式创建 dataContext 并在 c# 中为其分配网格(代码隐藏)

How to programatically create a dataContext and assign a grid to it in c# (code behind)

我对 WinUI3 和 XAML 还很陌生,所以我现在有一个非常具体的需求,这个需求意味着在代码后面动态地添加一组控件到网格,这工作得很好并且绑定操作都很棒,除了现在我需要为列表视图执行此操作,并且在该列表视图中有更多控件需要相应地填充。

这在 XAML 中相当容易,我所要做的就是编写如下内容:

<ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{x:Bind some_model.some_observableList_of_a_class, Mode=OneWay}">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Height="32" Padding="0" Margin="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="300"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <CheckBox IsThreeState="False" Margin="0" IsChecked="{Binding IsSelected, Mode=TwoWay}" Content="{Binding TextField, Mode=OneWay}"/>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

在后面的代码中执行此操作有点困难,这就是我需要你帮助的地方,我卡在 DataTemplate 部分,我可以声明它的一个新实例就好了,我可以声明一个网格的新实例并在其中放置一个新的复选框实例。 我的问题是我不知道如何将所述网格分配给 DataTemplate

DataTemplate dataTemplate = new DataTemplate();
Grid listViewItemTemplateGrid = new Grid();
CheckBox cbox = new CheckBox();
listViewItemTemplateGrid.RowDefinitions.Add(new RowDefinition());
listViewItemTemplateGrid.RowDefinitions[0].Height = new GridLength(0, GridUnitType.Auto);
listViewItemTemplateGrid.ColumnDefinitions.Add(new ColumnDefinition());
listViewItemTemplateGrid.ColumnDefinitions[0].Width = new GridLength(0, GridUnitType.Auto);

listViewItemTemplateGrid.Children.Add(cbox);

//here is where i'm stuck
dataTemplate.Children.Add(listViewItemTemplateGrid);//??How can i properly make this happen?

这就是我的问题,我如何使用 WinUi3/UWP 在 C# 中实现这一壮举?

提前感谢大家的帮助!

我认为在 UWP 和 WinUI 中以编程方式创建 DataTemplate 的唯一方法是使用 XamlReader.Load API:

const string Xaml = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" +
"<Grid Height=\"32\" Padding=\"0\" Margin=\"0\">" +
        "<Grid.ColumnDefinitions>" +
            "<ColumnDefinition Width=\"300\"/>" +
        "</Grid.ColumnDefinitions>" +
    "<Grid.RowDefinitions>" +
        "<RowDefinition Height=\"Auto\"/>" +
    "</Grid.RowDefinitions>" +
    "<CheckBox IsThreeState=\"False\" Margin=\"0\" IsChecked=\"{Binding IsSelected, Mode=TwoWay}\" Content=\"{Binding TextField, Mode=OneWay}\"/>" +
    "</Grid>" +
    "</DataTemplate>";

DataTemplate dataTemplate = XamlReader.Load(Xaml) as DataTemplate;

在 WPF 中有一个 VisualTree 属性,您可以将其设置为 FrameworkElementFactory,但恐怕在 WinUI 中没有这样的东西。