嵌套项控件。但是子项控制应该根据wpf中的特定条件显示

时间:2016-01-16 12:45:58

标签: wpf

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结束)。

This diagram explains details

1 个答案:

答案 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;
        }
    }
// ...