Используйте HierarchicalDataTemplate для отображения структурированных данных без использования родительского класса со списком или коллекцией дочерних объектов. - PullRequest
0 голосов
/ 10 января 2019

Я хочу использовать древовидное представление WPF с одним или несколькими шаблонами HierarchicalData для создания древовидного представления с отображением местоположений, упорядоченных по стране, штату и местоположению.

В этом вопросе я ищу решение MVVM XAMl для загрузки данных из модели представления в представлении с древовидным представлением с как можно меньшим количеством кода в самом представлении.

Пример снимка экрана из существующего приложения winforms.

Screen shot Winforms app

Упрощенные классы сущностей данных.

public class Country
{
    public string name{get;set;}
    public Int32 Id{get;set;}
}
public class State
{
    public string name{get;set;}
    public Int32 Id{get;set;}
}
public class Location
{
    public string name {get;set;}
    public Int32 CountryId {get;set;}
    public Int32 StateId {get;set;}
}

1 Ответ

0 голосов
/ 22 февраля 2019

Отказались от моего подхода и пошли с одним на основе примера кода проекта: Упрощение WPF TreeView с помощью шаблона ViewModel

    public class CountryViewModel : TreeViewItemViewModel
{
    readonly Country _country;

    public CountryViewModel(Country country)
                : base(null, true)
    {
        _country = country;
    }

    public string CountryName
    {
        get { return _country.CountryName; }
    }

    public IEnumerable<State>  States { get; set; }
    public IEnumerable<County> Counties { get; set; }
    public IEnumerable<DRC_SQLITE_Mines.Mine> Mines { get; set; }
    public IEnumerable<DRC_SQLITE_locations.Location> Locations { get; set; }             

    protected override void LoadChildren()
    {...}           

}

public class StateViewModel : TreeViewItemViewModel
{
    readonly State _state;

    public StateViewModel(State state, CountryViewModel parentCountry)
        : base(parentCountry, true)
    {
        _state = state;
    }

    public string StateName
    {
        get { return _state.StateName; }
    }

    public IEnumerable<County> Counties { get; set; }
    public IEnumerable<DRC_SQLITE_Mines.Mine> Mines { get; set; }
    public IEnumerable<DRC_SQLITE_locations.Location> Locations { get; set; }

    protected override void LoadChildren()
    {...}           
}

открытый класс CountyViewModel: TreeViewItemViewModel { только для чтения округа _county;

    public CountyViewModel(County county, StateViewModel parentState)
        : base(parentState, true)
    {
        _county = county;
    }

    public string CountyName
    {
        get { return _county.CountyName; }
    }

    public IEnumerable<DRC_SQLITE_Mines.Mine> Mines { get; set; }
    public IEnumerable<DRC_SQLITE_locations.Location> Locations { get; set; }

    protected override void LoadChildren()
    {...}

}

public class MineViewModel : TreeViewItemViewModel
{
    public MineViewModel(DRC_SQLITE_Mines.Mine mine, CountyViewModel parentCounty)
        : base(parentCounty, false)
    {
        Mine = mine;
    }
    public MineViewModel(DRC_SQLITE_Mines.Mine mine, StateViewModel parentState)
     : base(parentState, false)
    {
        Mine = mine;
    }
    public MineViewModel(DRC_SQLITE_Mines.Mine mine, CountryViewModel parentCountry)
     : base(parentCountry, false)
    {
        Mine = mine;
    }

    public DRC_SQLITE_Mines.Mine Mine { get; }

    RelayCommand _viewDataCommand;
    public ICommand ViewDataCommand
    {...}

}
...