簡體   English   中英

自定義WPF TreeView

[英]Custom WPF TreeView

我有一個自定義類,我想綁定一個具有三層的WPF TreeView。 每層都需要這樣綁定:

    Monitor 
     --> LCD
          --> Samsung 1445 LCD
     --> CRT
          --> Sony 125 CRT

這是示例代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        SystemInventory sysInventory = new SystemInventory();
        //Possibly do something like this.
        _myTreeView.DataContext = sysInventory.DeviceGroupInstances; 
    }

    public class SystemInventory
    {
        public ObservableCollection<DeviceGroup> DeviceGroupInstances { get; set; }

        public SystemInventory()
        {
            DeviceGroupInstances = new ObservableCollection<DeviceGroup>();
            DeviceGroupInstances.Add(new DeviceGroup("Monitor"));
        }
    }

    public class DeviceGroup
    {
        public string DeviceGroupName { get; set; }
        public ObservableCollection<DeviceType> DeviceTypeInstances { get; set; }

        public DeviceGroup(string deviceGroupName)
        {
            DeviceTypeInstances = new ObservableCollection<DeviceType>();
            DeviceGroupName = deviceGroupName;

            if (deviceGroupName == "Monitor")
            {
                DeviceTypeInstances.Add(new DeviceType("LCD"));
                DeviceTypeInstances.Add(new DeviceType("CRT"));
            }               
        }
    }

    public class DeviceType
    {
        public string DeviceTypeName { get; set; }
        public ObservableCollection<DeviceInstance> DeviceInstances { get; set; }

        public DeviceType(string deviceGroupName)
        {
            DeviceInstances = new ObservableCollection<DeviceInstance>();
            DeviceTypeName = deviceGroupName;

            if (deviceGroupName == "Monitor")
            {
                DeviceInstances.Add(new DeviceInstance("Samsung 1445 LCD"));
            }
            else
            {
                DeviceInstances.Add(new DeviceInstance("Sony 125 CRT"));
            }                
        }
    }

    public class DeviceInstance
    {
        public string DeviceInstanceName { get; set; }

        public DeviceInstance(string instanceName)
        {
            DeviceInstanceName = instanceName;
        }
    }
}

第一次修復

更改CTOR:

public MainWindow()
    {
        InitializeComponent();
        SystemInventory sysInventory = new SystemInventory();
        //Possibly do something like this.
        this.Content = sysInventory;
    }

第二次修復

在下面使用XAML(添加到MainWindow),其中{x:Type pc:MainWindow + SystemInventory}用於嵌套類

<Window.Resources>
    <DataTemplate DataType="{x:Type pc:MainWindow+SystemInventory}">
        <TreeView ItemsSource="{Binding DeviceGroupInstances}"/>
    </DataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type pc:MainWindow+DeviceGroup}" ItemsSource="{Binding DeviceTypeInstances}">
        <Label Content="{Binding DeviceGroupName}"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type pc:MainWindow+DeviceType}" ItemsSource="{Binding DeviceInstances}">
        <Label Content="{Binding DeviceTypeName}"/>
    </HierarchicalDataTemplate>

    <DataTemplate DataType="{x:Type pc:MainWindow+DeviceInstance}">
        <Label Content="{Binding DeviceInstanceName}"/>
    </DataTemplate>

</Window.Resources>

關於名稱空間

命名空間是使用類所需要知道的。 如果您的類具有名稱空間:

namespace MyCompany.MyProject.MyComponent
{
   public class SystemInventory
   {
      ....
   }
}

該名稱空間應使用別名添加到XAML以便使用:

<Window x:Class="MyCompany.MyProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:myAlias="clr-namespace:MyCompany.MyProject.MyComponent" 

    Title="Window1" Height="300" Width="350">
    <Window.Resources>
    ...

現在您可以在XAML中使用此類,例如:

<DataTemplate DataType="{x:Type myAlias:DeviceInstance}">
   <Label Content="{Binding DeviceInstanceName}"/>
</DataTemplate>

只需在查理已經給您的答案中翻譯屬性名稱即可。

<TreeView ItemsSource="{Binding DeviceGroups}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding DeviceTypeInstances}">
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding DeviceInstances}">
                    <TextBlock Text="{Binding DeviceInstanceName}"/>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
            <TextBlock Text="{Binding DeviceTypeName}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

您需要使用HierarchicalDataTemplate 在Stack Overflow(以及其他地方)上有很多這樣的示例,如果您四處搜索,很快就會找到一個。 我會創建一個模型來說明它,但是基於您的接受率非常低,我不確定它是否值得。 您應該查看過去的問題並接受所有問題的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM