2017-02-23 63 views
2

我有一個結合是這樣的:TreeView控件綁定到單個對象,其中包含許多對象

<TreeView x:Name="QueuesTreeView" 
      ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy, Mode=OneWay}" 
      BorderThickness="0"> ... 

QueueHierarchy是:

public class QueueHierarchy 
{ 
    public QueueHierarchy() 
    { 
     Children = new List<QueueHierarchy>(); 
    } 
    public int QueueID { get; set; } 
    public IList<QueueHierarchy> Children { get; set; } 
} 

我不知道我怎樣才能綁定到這個TreeView ?使用HierarchicalDataTemplateDataTemplate的問題是綁定數據類型是相同的......這是一個QueueHierarchy
那我怎麼能區分它們呢?

回答

1

如果你想弄清楚如何給孩子QueueHierarchy項目不同的模板比他們的父母,HierarchicalDataTemplate.ItemTemplate應該做的工作:

<TreeView 
    ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy.Children}" 
    > 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <!-- Blue bkg only to show that it's a different template --> 
        <TextBlock Background="SkyBlue" Text="{Binding QueueID}" /> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 

      <TextBlock Text="{Binding QueueID}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

如果層次是任意的深度,你可以讓孩子模板也是分層的。如果HierarchicalDataTemplate沒有ItemTemplate集合,它將無限期地用於其子女,兒童的孩子等。

<HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding QueueID}" /> 
</HierarchicalDataTemplate> 

您也可以給子模板自己的子模板。

如果您希望您的根集合項目是樹中的項目,我可以考慮幾個選項。

您可以編寫一個便宜且令人愉快的值轉換器,它接受任何給定的對象並返回僅包含該對象的集合。

public class EnumerateConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return new List<object> { value }; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML:

<TreeView 
    ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy, Converter={StaticResource EnumerateConverter}}" 
    > 

或者這會工作:

private QueueHierarchy _qh; 
public QueueHierarchy QueueHierarchy { 
    get { return _qh; } 
    set { 
     if (_qh != value) { 
      _qh = value; 
      OnPropertyChanged(nameof(QueueHierarchy)); 
      OnPropertyChanged(nameof(QueueHierarchyRootLevel)); 
    } 
} 
public IEnumerable<QueueHierarchy> QueueHierarchyRootLevel { 
    get { yield return QueueHierarchy; } 
} 

或者給QueueHierarchy返回相同的枚舉屬性:

public IEnumerable<QueueHierarchy> CollectionOfSelf { 
     get { yield return this; } 
    } 

XAML:

<TreeView 
    ItemsSource="{Binding ElementName=MainWindowName, Path=QueueHierarchy.CollectionOfSelf}" 
    > 

我開始認爲價值轉換器的想法是最「正確的MVVM」方法。你不希望你的viewmodels擔心這個問題。這真的是一個視角,轉換器將解決方法限制在視圖區域。

+0

「TreeView」的「ItemsSource」中的「Path = QueueHierarchy」綁定到單個項目。這是不對的,是嗎?這不是一個集合。 – mariocatch

+0

我想知道這件事。這是一個簡單的解決方法,請參閱更新中的'ItemsSource'綁定。 –

+0

這不包括根項目,但它恰好適用於我需要的內容(儘管可能不適用於其他人)。 – mariocatch