gpt4 book ai didi

C# WPF 使用 ItemsControl 管理嵌套结构

转载 作者:行者123 更新时间:2023-11-30 20:56:29 32 4
gpt4 key购买 nike

所以,我已经发布了一个关于 WPF 中嵌套控件结构的问题,它在这里: Nested controls structure - in XAML or C#?我收到了如下解决方案:

<ItemsControl ItemsSource="{Binding SomeCollectionOfViewModel}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding SomeCollection}"> <!-- Nested Content -->
...
</DataTemplate>
<ItemsControl.ItemTemplate>
</ItemsControl>

我已经使用了那个解决方案,想出了这个:

<!-- The UniformGrids - boxes -->
<ItemsControl ItemsSource="{Binding UniformGridCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

<ItemsControl.ItemTemplate>
<DataTemplate>

<!-- The TextBoxes - Cells -->
<ItemsControl ItemsSource="{Binding TextBoxCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>

</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

这是 C# 端:

public partial class MainWindow : Window
{
private readonly ObservableCollection<UniformGrid> uniformGridCollection = new ObservableCollection<UniformGrid>();
public ObservableCollection<UniformGrid> UniformGridCollection { get { return uniformGridCollection; } }
private readonly ObservableCollection<UniformGrid> textBoxCollection = new ObservableCollection<UniformGrid>();
public ObservableCollection<UniformGrid> TextBoxCollection { get { return textBoxCollection; } }
public MainWindow()
{
InitializeComponent();
for (int i = 1; i <= 9; i++)
{
UniformGrid box = new UniformGrid();
UniformGridCollection.Add(box);
UniformGrid cell = new UniformGrid();
TextBoxCollection.Add(cell);
}
DataContext = this;
}
}

但不知何故,统一网格内的“单元格” - 文本框不会创建。相反,我只得到 9 个统一网格包含在一个大的统一网格(在 Paneltemplate 中指定)。我用 Snoop v 2.8.0 检查了程序: http://i40.tinypic.com/htzo5l.jpg

问题是:有人能告诉我,为什么没有创建内部结构(文本框)?

最佳答案

您没有在任何地方定义任何 TextBoxes,这就是为什么您没有在可视化树中获得任何 TextBoxes 的原因:

<Window x:Class="MiscSamples.NestedItemsControls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="NestedItemsControls" Height="300" Width="300">
<ItemsControl ItemsSource="{Binding Level1}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Level2}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Value}"/> <!-- You Are missing this! -->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>

此外,如评论中所述,您的 Collections 应该是 ViewModel 或 Model 类型,而不是 UI 类型:

View 模型:

public class NestedItemsViewModel
{
public List<Level1Item> Level1 { get; set; }
}

public class Level1Item
{
public List<Level2Item> Level2 { get; set; }
}

public class Level2Item
{
public string Value { get; set; }
}

代码隐藏:

public partial class NestedItemsControls : Window
{
public NestedItemsControls()
{
InitializeComponent();

DataContext = new NestedItemsViewModel()
{
Level1 = Enumerable.Range(0, 10)
.Select(l1 => new Level1Item()
{
Level2 = Enumerable.Range(0, 10)
.Select(l2 => new Level2Item { Value = l1.ToString() + "-" + l2.ToString() })
.ToList()
})
.ToList()
};
}
}

请注意,如果您希望这些集合在运行时动态变化,则必须将 List 更改为 ObservableCollection

另请注意,您必须正确实现 INotifyPropertyChanged

关于C# WPF 使用 ItemsControl 管理嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493201/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com