0

我的下一個WPF樹視圖:在數據綁定WPF樹狀發展複選框葉子

 <TreeView HorizontalAlignment="Left" Margin="6,0,0,32" Name="tvProductos" Width="158"> 
      <TreeViewItem Header="Securities" IsExpanded="True" FontWeight="Bold"> 
       <TreeViewItem Header="Country" Name="Country" FontWeight="Normal" /> 
       <TreeViewItem Header="Currency" Name="Currency" FontWeight="Normal" /> 
       <TreeViewItem Header="Type" Name="Type" FontWeight="Normal" /> 
       <TreeViewItem Header="ISIN" Name="ISIN" FontWeight="Normal" /> 
       <TreeViewItem Header="Description" Name="Description" FontWeight="Normal" /> 
      </TreeViewItem> 
      <TreeViewItem Header="Issuer" IsExpanded="True" FontWeight="Bold"> 
       <TreeViewItem Header="Name" Name="IssuerName" FontWeight="Normal" /> 
       <TreeViewItem Header="Type" Name="IssuerType" FontWeight="Normal" /> 
       <TreeViewItem Header="Market" Name="IssuerMarket" FontWeight="Normal" /> 
      </TreeViewItem> 
     </TreeView> 

這種結構是固定的。然後我結合使用這樣的代碼低電平TreeViewItems:

 Country.ItemsSource = (from d in db.PAISES 
           join p in db.PRODUCTOS on d.IDPAIS equals p.IDPAIS 
           select d.NOMBREPAIS).Distinct(); 
     Currency.ItemsSource = (from d in db.DIVISAS 
           join p in db.PRODUCTOS on d.IDDIVISA equals p.IDDIVISA 
           select d.NOMBREDIVISA).Distinct(); 
     Type.ItemsSource = (from d in db.TIPOSPRODUCTO 
          join p in db.PRODUCTOS on d.IDTIPOPRODUCTO equals p.IDTIPOPRODUCTO 
          select d.NOMBRETIPOPRODUCTO).Distinct(); 
     ... 

的問題是,我需要在每個節點(低和高電平)上添加一個複選框。我一直在尋找解決方案,最好的解決方案是使用HierarchicalDataTemplate。但我從來沒有在同一時間找到有固定節點和動態節點的例子。我嘗試了幾個例子,但我無法解決它。

你能幫我嗎?

預先感謝您。

親切的問候。

回答

0

我會做它用,表示可以檢查的項目一個輔助類的方式(有人稱之爲「視圖模式」):

public class SelectableItem 
{ 
    public bool IsSelected { get; set; } 
    public string Label { get; set; } 
} 

這允許您指定一個DataTemplate這種特定類型:

<TreeView HorizontalAlignment="Left" Margin="6,0,0,32" Name="tvProductos" Width="158"> 
    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type local:SelectableItem}" xmlns:local="clr-namespace:WpfApplication1"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding IsSelected}" /> 
       <TextBlock Text="{Binding Label}" /> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 
    <TreeViewItem Header="Securities" IsExpanded="True" FontWeight="Bold"> 
     <TreeViewItem Header="Country" Name="Country" FontWeight="Normal" /> 
     <TreeViewItem Header="Currency" Name="Currency" FontWeight="Normal" /> 
     <TreeViewItem Header="Type" Name="Type" FontWeight="Normal" /> 
     <TreeViewItem Header="ISIN" Name="ISIN" FontWeight="Normal" /> 
     <TreeViewItem Header="Description" Name="Description" FontWeight="Normal" /> 
    </TreeViewItem> 
    <TreeViewItem Header="Issuer" IsExpanded="True" FontWeight="Bold"> 
     <TreeViewItem Header="Name" Name="IssuerName" FontWeight="Normal" /> 
     <TreeViewItem Header="Type" Name="IssuerType" FontWeight="Normal" /> 
     <TreeViewItem Header="Market" Name="IssuerMarket" FontWeight="Normal" /> 
    </TreeViewItem> 
</TreeView> 

所有你需要做的是稍微修改數據源:

Country.ItemsSource = (from d in db.PAISES 
         join p in db.PRODUCTOS on d.IDPAIS equals p.IDPAIS 
         select new SelectableItem { Label = d.NOMBREPAIS }).Distinct(); 

而這應該是訣竅。

+0

好的,它的工作原理!非常感謝你。現在,我如何檢索選定的節點? – Quicker

+1

大概有1000種方法可以做到這一點,這取決於你的應用程序是如何構建的,一種方式就是像這樣:'Country.ItemsSource.Cast ()。Where(i => i.Selected) ';) – madd0

+0

完美!非常感謝你! – Quicker