WPF中某一类型的对象的ObservableCollection和treeview绑定。

问题描述 投票:0回答:1

我试图将一个ObservableCollection对象绑定到一个TreeView上。对象类如下所示

public partial class Layer_Properties : Window
{    
    //fields
    private string _routeName;
    private  List<Stop> _Stops_List = new List<Stop>();

    public string routeName   // property
    {
        get { return _routeName; }   // get method
        set { _routeName = value; }  // set method
    }

    public List<Stop> Stops_List   // property
    {
        get { return _Stops_List; }   // get method
        set { _Stops_List = value; }  // set method
    }

    public List<PolylineBarrier> polylineBarriers// property
    {
        get { return _polylineBarriers; }   // get method
        set { _polylineBarriers= value; }  // set method
    }

    public Layer_Properties(RouteTask asolveRouteTask, MapViewModel aMapViewModel)
    {      
        InitializeComponent();
        solveRouteTask = asolveRouteTask;
        _mapViewModel = aMapViewModel;

        this.Loaded += async (o, e) =>
        {
            await Task.Run(() => getnetworkDatasetProprties(solveRouteTask));
            routeGUID = Convert.ToString(Guid.NewGuid());
            dateTime_label.IsEnabled = false;
            dateTime_ComboBox.IsEnabled = false;
            this.dateTime_ComboBox.Value = DateTime.UtcNow;
            Use_Time_Windows_chkbox.IsEnabled = false;
            Use_Time_Windows_chkbox.IsEnabled = false;
            Use_Time_Windows_chkbox.IsEnabled = false;
            PreserveFirstStop_chkbox.IsChecked = true;
            PreserveLastStop_chkbox.IsChecked = true;
            PreserveFirstStop_chkbox.IsEnabled = false;
            PreserveLastStop_chkbox.IsEnabled = false;

            Layer_Properties item = null;
            if (_mapViewModel.LayersPool.Count <= 1)
            {
                item = _mapViewModel.LayersPool[_mapViewModel.LayersPool.Count - 1];
            }
            else
            {
                item = _mapViewModel.LayersPool[_mapViewModel.LayersPool.Count - 2];
            }

            if (item != null)
            {
                item.routeName = IndexedFilename("Route", item.routeName);
            }
        };
    }

部分mapviewmodel如下图所示。

public class MapViewModel : INotifyPropertyChanged
{
    public MapViewModel()
    {
    }

    //test 09062020
    public ObservableCollection<Layer_Properties> LayersPool
    {
        get { return layersPool; }
        set
        {
            layersPool = value;
            NotifiyPropertyChanged("LayersPool");
        }
    }

    private ObservableCollection<Layer_Properties> layersPool= new 
    ObservableCollection<Layer_Properties>();

    void NotifiyPropertyChanged(string property)
    {
        if (LayersPoolChanged != null)
            LayersPoolChanged(this, new PropertyChangedEventArgs(property));
    }

    public event PropertyChangedEventHandler LayersPoolChanged;
    //endtest
}

部分xaml如下图所示。

<Window x:Class="GIS_App.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:esri="http://schemas.esri.com/arcgis/runtime/2013"
    xmlns:local="clr-namespace:GIS_App"
    mc:Ignorable="d"
    Title="MainWindow" Height="732" Width="1399" Closing="Window_Closing">

<Window.Resources>
    <local:MapViewModel x:Key="MapViewModel"/>
    <ImageBrush  x:Key="NetworkAnalystWindow" ImageSource="/icons/NetworkAnalystWindow.png" Stretch="UniformToFill"/>
    <ImageBrush  x:Key="AddNetworkElement" ImageSource="/icons/AddNetworkElement_btn.png" Stretch="UniformToFill"/>
    <ImageBrush  x:Key="solveRoute" ImageSource="/icons/solve_btn.png" Stretch="UniformToFill"/>
    <ImageBrush  x:Key="solvePremiumRoute" ImageSource="/icons/solvePremium_btn.png" Stretch="UniformToFill"/>
    <ImageBrush  x:Key="RouteDirections" ImageSource="/icons/directions_btn.png" Stretch="UniformToFill"/>
    <ImageBrush  x:Key="AddTrafficLayer" ImageSource="/icons/AddTrafficLayer.png" Stretch="UniformToFill"/>
    <ContextMenu x:Key="cmButton">
        <MenuItem Name ="Draw_Sketch" Header="Draw Sketch" Click="btn_Click"/>
        <MenuItem Name ="Save_Sketch" Header="Save Sketch" Click="btn_Click"/>
        <MenuItem Name ="Delete_Sketch" Header="Delete Sketch" Click="btn_Click" IsEnabled="True"/>
        <MenuItem Name ="Remove_Selected_Vertex" Header="Remove Selected Vertex" Click="btn_Click" IsEnabled="True"/>
        <MenuItem Name ="Cancel" Header="Cancel" Click="btn_Click" IsEnabled="True"/>
        <Separator />
        <MenuItem Header="Address Geocoding" Click="btn_Click" IsEnabled="True"/>
    </ContextMenu>
    <ContextMenu x:Key="treeViewMenu">
        <MenuItem Name ="Delete_TreeViewElement" Header="Delete" Click="btn_Click"/>
        <MenuItem Name ="Delete_All_TreeViewElements" Header="Delete All" Click="btn_Click"/>
        <MenuItem Name ="Open_Attribute_Table" Header="Open_Attribute_Table" Click="btn_Click" IsEnabled="True"/>
    </ContextMenu>
</Window.Resources>

<Grid HorizontalAlignment="Left" Height="Auto" Margin="5,25,0,20" VerticalAlignment="Stretch" Width="155">

            <!-- hieracical binding -->
            <TextBlock Text="Hierarchical root binding}" Foreground="Red" Margin="10,20,0,0"/>
            <TreeView ItemsSource="{Binding LayersPool}" Margin="10" Height="200">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding LayersPool}" DataType="{x:Type local:Layer_Properties}">
                        <TreeViewItem Header="{Binding routeName}"/>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

我做了无数次尝试来使它工作,但我找不到一个解决方案。我想实现的是创建一个treeview,如下图所示。

Route_1
  Stops
    Stop1
    Stop2
    Stop3
  Polyline Barriers
    Barrier 1
Route_2
  Stops
    Stop1
    Stop2
  Polyline Barriers
    Barrier 1
    Barrier2

编辑 我怀疑可能是绑定的问题,因为LayersPool observablecollection是一个mapviewmodel集合。欢迎任何帮助。

c# wpf mvvm treeview observablecollection
1个回答
0
投票

我想你需要了解如何 TreeView 绑定工作。

你可以在这里看看。wpf treeview 绑定 以及这里。https:/www.wpf-tutorial.comtreeview-controltreeview-data-binding-multiple-templates

一般来说,如果每个 TreeViewItem ViewModel需要做一些特定的事情(例如一旦用户点击它,那么你需要为每个ViewModel创建自己的特定类。TreeViewItem.

你可以创建一个 AbstractViewModel 作为每个 TreeViewItem ViewModel,基本上包含2个属性。

  1. Children 绑定到 ItemsSourceHierarchicalDataTemplate 其中包含 ObservableCollection 视图项的叶数
  2. Name 绑在你 Text 的财产 TextBlock 你放在你 DataTemplate 来显示树状视图项目的文字。
© www.soinside.com 2019 - 2024. All rights reserved.