【问题标题】:Treeview binding to view model not working树视图绑定到视图模型不起作用
【发布时间】:2015-01-01 08:18:50
【问题描述】:

我查看了 Treeview 绑定的所有示例, 但我仍然无法将它从视图模型绑定到 Treeview。 请让我知道我在这里缺少什么。

//这是我的类,需要在 UI 中生成为树视图。

public class Station
{        
   public string Name { get; set; } // Header of Treeview

    public ObservableCollection<AnalogToDigital> Adc { get; set; }
    public ObservableCollection<DigitalToAnalog> Dac { get; set; }
    public ObservableCollection<AuxilaryInputs> AuxInput { get; set; }
}

//ADC channel Details
public class AnalogToDigital
{
    public string InternalName { get; set; }               
}

//DAC channel details
public class DigitalToAnalog
{
   public string InternalName { get; set; }

}
//Input output pin details
public class AuxilaryInputs
{       
    public string InternalName { get; set; }            
}

//View.xaml: 树视图 xaml 代码:

<TreeView Name="StationTree" HorizontalAlignment="Left" Height="326.04" Margin="10,10,0,0"    
 VerticalAlignment="Top" Width="188" ItemsSource="{Binding StationTree}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding StationTree}">
                    <TreeViewItem Header="{Binding Name}"/>                        
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding StationTree.Adc}">
                            <TreeViewItem Header="{Binding StationTree.Adc.InternalName}"/>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>

                </HierarchicalDataTemplate>                            
            </TreeView.ItemTemplate>
        </TreeView>

//ViewModel:我这里用的是mvvmlight

public class MainViewModel : ViewModelBase
{
    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        // Move it to business layer
        StationXmlOperation stRead = new StationXmlOperation();

        StationTree = (Station)stRead.Read(@"C:\Station.xml");           

    }

    private string _name;
    private Station _stationTree;

 public Station StationTree
 {
     get { return _stationTree; }

     set
     {
         _stationTree = value;
         RaisePropertyChanged(() => StationTree);
     }
 }
}

//代码隐藏文件:View.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var viewModel = new MainViewModel();
        this.DataContext = viewModel;

        //this.StationTree.DataContext = viewModel.StationTree;
        this.StationTree.Items.Add(viewModel.StationTree);
    }
}

//XML文件:Station.xml

<StationDetails>
<Station id="1" Name="FirstStation">
<ADCs>
<ADC id="1" InternalName="ADC1" ></ADC>
<ADC id="1" InternalName="ADC2" ></ADC>
</ADCs>
<DACs>
<DAC id="1" InternalName="DAC1"  ></DAC>
<DAC id="1" InternalName="DAC2"  ></DAC>
</DACs>
<IOs>
<IO id="1" InternalName="IO1" ></IO>
</IOs>
</Station>
</StationDetails>

// 从上面的对象层次结构中期望的Treeview是

Name
->ADC
-->InternalName 
->DAC
-->InternalName
->AuxInput
-->InternalName

当前代码仅显示“FirstStation”。

请帮助我,我是第一次使用树视图。

【问题讨论】:

  • 第一个问题:视图模型上的属性“StationTree”不是一个集合,它只是一个对象:“Station”。您正在尝试将其绑定到 ItemsSource,因此它需要是一个集合。下一步:您在 HierarchicalDataTemplates 中的 ItemsSource 绑定是错误的。用于此的 DataContext 是构成 TreeView 绑定到的原始集合的各个对象,而不是 ViewModel 本身。
  • 如何将以下类绑定到 Treeview。 public class Station { public string Name { get; set; } // Header of Treeview public ObservableCollection&lt;AnalogToDigital&gt; Adc { get; set; } public ObservableCollection&lt;DigitalToAnalog&gt; Dac { get; set; } public ObservableCollection&lt;AuxilaryInputs&gt; AuxInput { get; set; } }

标签: wpf xaml mvvm treeview


【解决方案1】:

我认为您的方法中缺少 xpath。使用 xpath 创建 HDT

<HierarchicalDataTemplate x:Key="NodeTemplate">
        <HierarchicalDataTemplate.ItemsSource>
            <Binding XPath="child::*" />
        </HierarchicalDataTemplate.ItemsSource>           
            <TextBlock Text="{Binding Path=Name}" />
    </HierarchicalDataTemplate>

请关注this,this,thisthis 了解Treeview with XML Data

希望对你有帮助!!!

【讨论】:

  • 嗨,我没有直接在 View 中绑定到 xml。我想将它绑定到 Viewmodel 中的 Station 类对象以查看。上面的例子解释了直接绑定到 xml。请告诉我。
【解决方案2】:

您将不得不更改对象模型以使其与 TreeView 一起使用。照原样,不可能让它以您想要的方式与 TreeView 一起工作,它只是不兼容(您只能将 HierarchicalDataTemplate 绑定到子项的一个集合,您有三个集合,并且您希望每个集合都是它们的节点自己的)。

public class Station
{        
    public string Name { get; set; } // Header of Treeview
    public ObservableCollection<DetailGroup> DetailGroups { get; set; }
}

public class DetailGroup
{
    public string GroupName { get; set;}
    public ObservableCollection<Detail> Details { get; set; }
}

public class Detail
{
    public string InternalName { get; set; }               
}

public class ADC : Detail
{
    //...
}

public class DAC : Detail
{
    //...
}

public class AuxInput : Detail
{
    //...
}

对象模型在 XML 中基本上看起来像这样(这只是一个示例,供您查看对象模型,您可以保持原始 XML 不变,只需更改您的 StationXmlOperation.Read 方法):

<StationDetails>
  <Station Name="FirstStation">
    <DetailGroup GroupName="ADCs">
      <ADC InternalName="ADC1"/>
      <ADC InternalName="ADC2"/>
    </DetailGroup>
    <DetailGroup GroupName="DACs">
      <DAC InternalName="DAC1"/>
      <DAC InternalName="DAC2"/>
    </DetailGroup>
    <DetailGroup GroupName="AuxInputs">
      <AuxInput InternalName="AuxInput1"/>
      <AuxInput InternalName="AuxInput2"/>
    </DetailGroup>
  </Station>
</StationDetails>

就像我在评论中提到的,您需要将 TreeView 的 ItemsSource 绑定到集合而不是单个对象(如果您只有一个对象,只需将其包装在集合中):

public class MainViewModel : ViewModelBase
{
    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        // Move it to business layer
        StationXmlOperation stRead = new StationXmlOperation();
        _stationTree = (Station)stRead.Read(@"C:\Station.xml");           
    }

    private string _name;
    private Station _stationTree;

    public IEnumerable<Station> StationTree
    {
        get { yield return _stationTree; }
    }
}

XAML:

<TreeView ItemsSource="{Binding StationTree}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding DetailGroups}">
            <TextBlock Text="{Binding Name}"/>                        
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Details}">
                    <TextBlock Text="{Binding GroupName}"/>                  
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding InternalName}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>                            
    </TreeView.ItemTemplate>
</TreeView>

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2018-01-31
    • 2017-05-22
    • 2016-06-14
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多