TreeView с Caliburn Micro c# WPF - PullRequest
       20

TreeView с Caliburn Micro c# WPF

0 голосов
/ 21 января 2020

Я пытаюсь заставить дерево работать с моими данными. Я использую WPF MVVM с Caliburn Micro, но почему-то я не могу заставить работать привязки так, как хочу.

Мои данные в упрощенном виде выглядят так.

Операция класса

public class Operation
{
    public string Name { get; set; }
    public int Id { get; set; }

    public ObservableCollection<Parameters> parameters { get; set; }

    public Operation()
    {
        parameters = new ObservableCollection<Parameters>();
    }
}

и параметры класса

    public class Parameters
{
    public string par { get; set; }
    public double val { get; set; }

    public ObservableCollection<Joints> Joints { get; set; }

    public Parameters()
    {
        Joints = new ObservableCollection<Joints>();
    }
}

И класс соединений

В моей ShellViewModel я инициализирую эти классы и помещаю некоторые данные внутри ...

public Operation _Operation = new Operation();
int moveId = 0;

public BindableCollection<Operation> Operations
    {
        get { return _Operations; }
        set 
        { 
            _Operations = value;
            NotifyOfPropertyChange(() => Operations);
        }
    }

 public ShellViewModel()
    {

    var moveOperation = new Operation
        {
            Id = moveId,
            Name = $"Move{moveId}"
        };
        Joints jt1 = new Joints() { Par = "J0", Val = 2.34 };
        Joints jt2 = new Joints() { Par = "J0", Val = 0.34 };
        Parameters parm = new Parameters { par = "a", val = 2.13 };
        parm.Joints.Add(jt1);
        parm.Joints.Add(jt2);
        moveOperation.Parameters.Add(parm);

}

Моя цель - визуализировать его в виде дерева примерно так:

 - Move1
    -a 2.13
    -Joints
      -J0 2.34
      -J1 0.34
 - Move2
    -a 'some value'
    -Joints
      -J0 'some value'
      -J1 'some value'

Но как бы я ни пытался заставить xaml работать, Я никогда не мог показать детям ... Это только один из примеров, которые я сделал.

                    <TreeView Grid.Row="1" Grid.Column="1" MinWidth="150"
                          ItemsSource="{Binding Operations}">
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Parameters}">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock VerticalAlignment="Center" Text="{Binding par}"/>
                                    <TextBlock Text=" " ></TextBlock>
                                <TextBlock VerticalAlignment="Center" Text="{Binding val}"/>
                                <TextBlock VerticalAlignment="Center" Text="{Binding Par}"/>

                                <TextBlock VerticalAlignment="Center" Text="{Binding Val}"/>
                                <TextBlock VerticalAlignment="Center" Text="{Binding Par}"/>

                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock VerticalAlignment="Center" FontSize="15" Text="{Binding Name}"/>
                                    </StackPanel>
                                </StackPanel>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
                </TreeView>

Пожалуйста, примите к сведению любые рекомендации или помощь, я потерял три полных дня, только пытаясь заставить это дерево работать. Спасибо!

РЕДАКТИРОВАТЬ: У меня была опечатка в классе параметров, спасибо за указание на это. Я хотел переместить Суставы на один уровень ниже, чем раньше, на самом деле это была моя проблема, как попасть на более глубокие уровни

1 Ответ

0 голосов
/ 22 января 2020

В вашем XAML для древовидного представления вы должны сделать так, чтобы получить детей.

Добавьте свой класс операций и пространство имен параметров в XAML, как показано ниже.

xmlns:local="clr-namespace:TxsDiagnosticTool"

 <TreeView Name="trvFamilies" ItemsSource="{Binding Operations}" MinHeight="150" >
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type local:Parent}"  ItemsSource="{Binding Parameters}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                        <TextBlock Text="{Binding Id}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type Parameters}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding par0 }" />
                        <TextBlock Text="{Binding val0 }" />
                    </StackPanel>
                </DataTemplate>
            </TreeView.Resources>  
        </TreeView>

в вашем коде

Класс операций:

public class Operation
{
    public string Name { get; set; }
    public int Id { get; set; }

    public ObservableCollection<Parameters> Parameters { get; set; }

    public Operation()
    {
        Parameters = new ObservableCollection<Parameters>();
    }
}

Класс параметров:

public class Parameters
{
    public string par0 { get; set; }
    public string par1 { get; set; }
    public double val0 { get; set; }
    public double val1 { get; set; }
}

В ViewModel

private ObservableCollection<Operation> operations= new ObservableCollection<Operation>();
public ObservableCollection<Operation> Operations
  {
     get { return operations; }
     set
     {
        //Replace with your property changed code.
        //SetProperty(ref operations, value); 
     }
   }
int moveId = 0;


public ShellViewModel()
    {

        Operation operation1 = new Operation() { Id = moveId, Name = "Move1" };
        operation1.parameters.
        Add(new Parameters() { par0 = "J0", val0 = 2.34, par1 = "J1", val1 = 0.43 });

        moveId++;

        Operation operation2 = new Operation() { Id = moveId, Name = "Move2" };
        operation2.parameters.
        Add(new Parameters() { par0 = "J0", val0 = 5.32, par1 = "J1", val1 = 3.33 });

        Operations.Add(operation1);
        Operations.Add(operation2);
         moveId++;
    }
...