【发布时间】: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<AnalogToDigital> Adc { get; set; } public ObservableCollection<DigitalToAnalog> Dac { get; set; } public ObservableCollection<AuxilaryInputs> AuxInput { get; set; } }