2014-02-05 3 views
2

Я пытаюсь связать коллекцию объектов, хранящихся в модели, с деревом в WPF. Мой XML для этого был основан на WPF Treeview Databinding Hierarchal Data with mixed types, но мне не повезло.Связывание с древовидной структурой в WPF

Мой текущий XAML выглядит так для дерева.

<TreeView Name="ConfigurationFilter"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type models:MyModel}" ItemsSource="{Binding Path=Filters.FilterType1}"> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox></CheckBox> 
        <Label Content="{Binding Path=Name}"></Label> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

У меня есть модель, которая выглядит как этот

public class MyModel 
{ 
    public Observable<MyFilter> FilterType1 {get;set;} 
    public Observable<MyFilter> FilterType2 {get;set;} 
} 

public class MyFilter 
{ 
    public string Name {get;set;} 
    public bool IsSelected {get;set;} 
} 

В пределах моего MainWindow.xaml.cs я следующее:

public partial class MainWindow : Window 
{ 
    public MyModel Filters { get; set; } 
} 

Свойство FilterType1 имеет 331 пунктов в нем. Но когда я запускаю приложение, привязка никогда не произойдет. Я не вижу никаких элементов в своем Treeview. Что я делаю не так?

Update 1

Я добавил мой главное окно в качестве контекста данных для TreeView и связывания, как это предлагается, но я до сих пор не имеют каких-либо элементов в дереве

<TreeView Name="ConfigurationFilter" ItemsSource="{Binding Filters}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type models:MyModel}" ItemsSource="{Binding Path=Filters.FilterType1}"> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox></CheckBox> 
        <Label Content="{Binding Path=Name}"></Label> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

и мой MainWindow.cs

public MainWindow() 
    { 
     InitializeComponent(); 
     ConfigurationFilter.DataContext = this; 
    } 

ответ

2

Я был в состоянии получить эту работу, изменив свой TreeView, чтобы привязать к композитной модели представления, как показано on CodeProject.

<TreeView Grid.ColumnSpan="2" Grid.RowSpan="2"> 
     <TreeViewItem Header="Routes" Name="RouteView" ItemsSource="{Binding Routes}"> 
      <TreeViewItem.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type viewModels:RouteViewModel}" ItemsSource="{Binding}"> 
        <StackPanel Orientation="Horizontal"> 
         <Label Content="{Binding Path=Name}" VerticalAlignment="Center"></Label> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeViewItem.ItemTemplate> 
     </TreeViewItem> 
    </TreeView> 

Поскольку мой TreeView будет иметь несколько узлов корня, которые предопределены, я должен был связать источник данных для каждого корня TreeViewItem. Затем я поместил объекты в составную модель.

Composite View Model

public class DomainViewModel 
{ 
    public ReadOnlyCollection<RouteViewModel> Routes { get; set; } 
    public ReadOnlyCollection<SkyViewModel> SkyLines { get; set; } 

    public DomainViewModel(List<Route> routes) 
    { 
     Routes = new ReadOnlyCollection<RouteViewModel>(
      (from route in routes 
      select new RouteViewModel(route)) 
      .ToList<RouteViewModel>()); 
    } 

     Skylines = new ReadOnlyCollection<SkyViewModel>(
      (from route in routes 
      select new SkyViewModel(route)) 
      .ToList<SkyViewModel>()); 
    } 
} 

ViewModel - только 1 показано, чтобы помочь читаемость.

public class RouteViewModel : INotifyPropertyChanged 
{ 
    private Route _route; // My actual database model. 

    public string Name 
    { 
     get { return _route.RouteName; } 
    } 

    public RouteViewModel(Route route) 
    { 
     _route = route; 
    } 
} 

MainWindow

public MainWindow() 
    { 
     InitializeComponent(); 

     this.DomainFilterTreeView.DataContext = new this.Domains; 
    } 
0

TreeView не имеют ItemsSource обязан. Предполагая, что DataContextTreeView является вашим MainWindow, тогда вы можете добавить привязку ItemsSource.

<TreeView Name="ConfigurationFilter" ItemsSource={Binding Filters}> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type models:MyModel}" ItemsSource="{Binding Path=Filters.FilterType1}"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox></CheckBox> 
       <Label Content="{Binding Path=Name}"></Label> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
    ConfigurationFilter.DataContext = this; 
    } 

    public MyModel Filters { get; set; } 
} 
+0

Я дал этот выстрел, и он до сих пор не работает. Я обновил свой вопрос, чтобы показать свой код XAML и MainWindow.cs, используя ваш пример. Ничто не представлено в пользовательском интерфейсе. Считаете ли вы, что это проблема, связанная с попыткой привязки к свойствам внутри объекта, такого как Filters.FilterType1? –

+0

Как вы заполняете фильтры? Это не похоже на код, который будет заполнять его. –

+0

Да, MyObject извлекается из репозитория. Репозиторий заполняет коллекции FilterType данными базы данных до возвращения объекта в MainWindow. Это происходит в методе загрузки окна –

Смежные вопросы