WPF:在Items控件中,我想显示另一个项控件。但是,我想根据某些条件仅显示父项控件的特定项目集的子项控件值,如下图所示。请让我知道,我们怎么做到这一点。 Nested items control with specific condition
更多详情:
我有一个项目控件,基于项目控件中的项目;我将在UI中绘制矩形框。即items控件中的每个项表示一个矩形框,所有这些矩形框按顺序表示(在UI中一个接一个地表示)。
现在,我还有一个数字集合(例如10,20,30,40等)。这些数字我想表示为特定连续矩形框下面的时间尺度。也就是说,我的父项控件中有10个项目,然后UI中会有10个矩形框。现在,我想仅根据我的父项类型在第4和第5个矩形框的底部表示一个时间刻度(即第4和第5个框将具有从10到100的一个公共时间刻度(它不是独立的时间刻度,即一个水平第4和第5项以下的线,即水平线从第4个下方开始,在第5个项目下方结束。此行依次显示10到100的值))。 类似地,我可能需要仅在第8,第9和第10项之下表示一个更常见的时间刻度(即,该水平线以10开始并且可能以值200结束)。
答案 0 :(得分:0)
基本的想法是,有一个子集合包含部分项目和常见的附加额外信息,而不是在一系列项目上拉伸额外信息。
我想你有一个viewmodel,拿着你的物品。您可以使用公共基类(下面为ItemBase
)实现子项集合和单个项目
public class ItemBase : BaseViewModel
{
}
public class SubItemCollection : ItemBase
{
private IEnumerable<ItemBase> _SubItems;
public IEnumerable<ItemBase> SubItems
{
get { return _SubItems; }
set { _SubItems = value; NotifyPropertyChanged(); }
}
private string _CommonText;
public string CommonText
{
get { return _CommonText; }
set { _CommonText = value; NotifyPropertyChanged(); }
}
}
public class LeafItem : ItemBase
{
private string _Text;
public string Text
{
get { return _Text; }
set { _Text = value; NotifyPropertyChanged(); }
}
}
我使用BaseViewModel
作为基类,处理INotifyPropertyChanged
之类的事情。
在您的XAML中,为每个项目类型定义一个模板作为资源。对于集合类型,在项目
下方显示其他信息<Window.Resources>
<DataTemplate DataType="{x:Type local:LeafItem}">
<Border Margin="3" Padding="3" BorderThickness="1" BorderBrush="Red" VerticalAlignment="Top">
<TextBlock Text="{Binding Text}"/>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type local:SubItemCollection}">
<StackPanel>
<ItemsControl ItemsSource="{Binding SubItems}" BorderBrush="Green">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<Separator BorderBrush="Blue" BorderThickness="1"/>
<TextBlock Text="{Binding CommonText}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
最后,在XAML中的某个位置,填充ItemBase
元素列表
<ItemsControl ItemsSource="{Binding Items}" BorderBrush="Green">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel LastChildFill="False"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
您可以使用以下数据上下文对此进行测试:
public class MyViewModel : BaseViewModel
{
private ItemBase _Items;
public ItemBase Items
{
get { return _Items; }
set { _Items = value; NotifyPropertyChanged(); }
}
}
public partial class MainWindow : Window
{
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
data = new MyViewModel();
data.Items = new ItemBase[]
{
new LeafItem()
{
Text="Item 1"
},
new SubItemCollection()
{
SubItems = new ItemBase[]{
new LeafItem()
{
Text="SubItems 2.1"
},
new LeafItem()
{
Text="SubItems 2.2"
}
},
CommonText = "Extra"
},
new LeafItem()
{
Text="Item 3"
}
};
DataContext = data;
}
}
// ...