2014-02-05 80 views
2

我想將模型持有的對象的集合綁定到WPF中的樹視圖。我的XML做到這一點是基於WPF Treeview Databinding Hierarchal Data with mixed types,但我沒有任何運氣。在WPF中綁定到樹視圖

我目前的XAML看起來是這樣的treeview。

<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中看不到任何項目。我究竟做錯了什麼?

更新1

我已經加入我的主窗口,作爲樹視圖中的數據上下文和約束力的建議,但我仍然沒有任何項目在樹

<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

我能夠通過修改我的樹視圖作爲證明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。然後我把我的對象放入一個複合視圖模型中。

複合視圖模式

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>()); 
    } 
} 

視圖模型 - 僅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; 
    } 
} 

主窗口

public MainWindow() 
    { 
     InitializeComponent(); 

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

TreeView沒有一個ItemsSource必然。假設TreeViewDataContext是您的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是從存儲庫中獲取的。在將對象返回到MainWindow之前,存儲庫使用數據填充FilterType集合。這發生在窗口加載方法 –