gpt4 book ai didi

c# - ItemsControl 显示几层数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:43 25 4
gpt4 key购买 nike

我有一个 ObservableCollection用名称和一组 3D 坐标分类的对象。我还有一个 ObservableCollection层,每个层都应该包含一个二维网格。

问题设置

目标是使用 ItemsControl ,可能是嵌套的,以下列方式显示这些对象:如果 Z 坐标确定图层,X 和 Y 坐标指定每个对象在网格上的位置,则对象应显示在 TabControl 中。 , 其中TabItem对应于 Z 坐标并承载一个 Grid Grid.Row在哪里和 Grid.Column属性确定对象名称在 TabItem 上的位置.

重要提示:虽然每个 3D 坐标只使用一次,但一个“Entry”对象可能有多个 3D 坐标,因此可能在网格上出现多次和/或不同的 TabItems .

注意:数据模型不是一成不变的;如果问题可以用另一个数据模型解决,我愿意改变它。然而,显示是客户的要求 - 它可能会被修改,但我需要非常好的论据。

背景信息

对象看起来像这样(BindableBase 来自 Prism 库):

public class Entry : BindableBase {
public string Name { set; get; }

private EntryCoordinates coordinates;
public EntryCoordinates Coordinates {
set { SetProperty(ref coordinates, value); }
get { return coordinates; }
}
}

public class EntryCoordinates : BindableBase {
private int x;
public int X {
set { SetProperty(ref x, value); }
get { return x; }
}

private int y;
public int Y {
set { SetProperty(ref y, value); }
get { return y; }
}

private int z;
public int Z {
set { SetProperty(ref z, value); }
get { return z; }
}
}

Entry对象托管在“入口层”:

public class EntryLayer : ObservableCollection<Entry> {
}

最终,我希望能够修改 Entry通过 UI 对象(在现实中更复杂),因此双向数据绑定(bind)是绝对必要的。

到目前为止的努力

使用@Rachel 的优秀 WPF Grid Extension ,我实现了一个 ItemsControl填充 Grid根据需要:

<ItemsControl ItemsSource="{Binding EntryLayers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid GridExtension.RowCount="{Binding RowCount}"
GridExtension.ColumnCount="{Binding ColumnCount}"
GridExtension.StarRows="{Binding StarRows}"
GridExtension.StarColumns="{Binding StarColumns}"
IsItemsHost="True"/>
</ItemsPanelTemplate>

</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row" Value="{Binding Coordinates.X}"/>
<Setter Property="Grid.Column" Value="{Binding Coordinates.Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<GridCellThumb XCoordinate="{Binding Coordinates.X}"
YCoordinate="{Binding Coordinates.Y}">
<Thumb.Template>
<ControlTemplate>
<TileControl Entry="{Binding}"/>
</ControlTemplate>
</Thumb.Template>
</GridCellThumb>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

GridCellThumb是一个自定义控件,允许拖放(为清楚起见此处省略)并公开坐标依赖属性:

public class GridCellThumb : Thumb {
public static readonly DependencyProperty XCoordinateProperty = DependencyProperty.Register("XCoordinate", typeof(int), typeof(GridCellThumb));
public int XCoordinate {
get { return (int)GetValue(XCoordinateProperty); }
set { SetValue(XCoordinateProperty, value); }
}

public static readonly DependencyProperty YCoordinateProperty = DependencyProperty.Register("YCoordinate", typeof(int), typeof(GridCellThumb));
public int YCoordinate {
get { return (int)GetValue(YCoordinateProperty); }
set { SetValue(YCoordinateProperty, value); }
}
}

TileControl是一个显示 Entry 的用户控件姓名:

<StackPanel Orientation="Vertical">
<Label Content="{Binding Path=Name}" />
</StackPanel>

我一直在寻找如何包装原件 ItemsControlTabControl模板,以便在不同的时间正确显示条目。例如,绑定(bind)到 Coordinates.Z路径有效,但会创建尽可能多的 TabItems因为有条目:

<TabControl ItemsSource="{Binding Entries}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header"
Value="{Binding Coordinates.Z}" />
<Setter Property="TabIndex"
Value="{Binding Coordinates.Z}" />
</Style>
</TabControl.ItemContainerStyle>
<!-- the ItemsControl goes here -->
</TabControl>

我已经尝试过@greg40(nested ItemsControl )、@d.moncada(another nested ItemsControl )和@Sheridan(going up the visual tree)提出的解决方案,但在关联Entry时我总是光荣地失败给定 EntryLayer .

有没有人有进一步的想法要探索?正如我所说,如果这能带来更简单的解决方案,我也愿意重新构建我的数据模型。

2018-01-08更新

我探索了使用 Button 的途径s 而不是 TabControl在数据绑定(bind)他们的点击状态的意义上,在网格上显示不同的信息。然而,这只是转移了问题并产生了新的问题:数据不再预加载,这对客户的需求至关重要。

我现在正在认真考虑向客户建议更改需求并设计一个完全不同的数据模型。为了避免再次走错路,如果社区中有人对这个问题有强烈的看法并愿意与我分享,我将不胜感激。

最佳答案

在从同行专家那里得到一些非常有值(value)的线下建议后,我决定反对客户建议的数据模型,并为他们提供替代解决方案。现在的方法是以自上而下的方式填充 View

本质上,这意味着以前我的 Z 坐标现在是专用 EntryLayer 的索引。定义 TabItem 的对象秒。每个EntryLayer有一个 ObservableCollection<Entry>指的是那些 Entry是那个的一部分EntryLayer .

从某种意义上说,这与初始模型形成对比,现在不再可能 Entry可以有多个坐标;相反,Entry本身可能以不同的坐标多次存在。

我是如何把它卖给客户的?我告诉他们现在一个Entry可能具有自定义选项,这些选项在相同或其他的表示之间可能不同 EntryLayer s,例如,通过使用用户指定的颜色和字体,同时仍然指向相同的基本信息。它给了我更多的实现方面的工作,但它通过以新功能的形式优雅地解决了僵局。

关于c# - ItemsControl 显示几层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48092155/

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