2013-11-01 50 views
0

所以,我有不同datatemplates一個listview這裏看到的物體:使用多個樹視圖具有相同(但克隆)的ItemsSource

<ListView Panel.ZIndex="0" x:Name="FilterList" Margin="10,0" Grid.Row="2" 
    Grid.ColumnSpan="3" Background="White" ItemTemplateSelector="{StaticResource 
    ReportFilterTemplateSelector}" ItemsSource="{Binding reportParameters, 
    Mode=TwoWay}" ScrollViewer.CanContentScroll="False"> 

我的一個樣本datatemplates的可以看到下面。一切都顯得很棒。我的問題是,對於這個(和其他)datatemplates,我可以有多個同一個實例。在這種特定情況下,treeviewitemssource勢必DataContext.OfficeListText填充的所有元素。

<DataTemplate x:Key="office"> 
     <Grid MinHeight="35" MaxHeight="250"> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding rpName}" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" /> 
      <Expander HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="1" 
       Header="{Binding Path=DataContext.OfficeListText, RelativeSource= 
       {RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
       VerticalAlignment="Top" ExpandDirection="Down"> 

       <TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" ItemsSource="{Binding 
        Path=DataContext.OfficeList, RelativeSource={RelativeSource 
        FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}" 
        ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
        ItemContainerStyle="{StaticResource TreeViewItemStyle}"/> 
      </Expander> 
     </Grid> 
    </DataTemplate> 

的主要問題,這是一個,例如,如果我選擇一個辦公室說,第一treeview,第二treeview顯示了相同的。基本上我希望他們最初有相同的itemssource,但有不同的實例。由於它們是動態生成的,所以我陷入困境。任何幫助,將不勝感激。

我不確定其他代碼是否有必要,因爲我相信大部分代碼都是不合適的,這取決於我需要做什麼來完成這項工作,但如果您想要更多,我會很樂意提供。謝謝!

+0

你能否詳細說明在「如果我選擇一個辦公室在說第一個樹視圖,第二個樹視圖顯示相同」? – foosburger

+0

嗯,數據模板用於綁定數據...如果你想要不同的數據源,你應該綁定到不同的實例...我相信你應該能夠在控件的資源中創建一個實例並綁定到這個實例上我並沒有真正瞭解你的問題的全貌,所以你可能想改進它... – UIlrvnd

+0

@foosburger說兩個「辦公室」數據模型被顯示,一個會發生什麼影響另一個。我假設這是因爲樹視圖本身綁定到相同的'DataContext.OfficeList'實例。 – jmgardn2

回答

0

目前您的TreeView控件綁定到OfficeList的單個實例屬於你的用戶控件的DataContext的。這意味着每個TreeView都指向相同的列表。如果我正確理解你的問題,你真正想要的是爲每個TreeView擁有一個不同的OfficeList實例。

我不建議的DataTemplate應用於reportParameter每次實例化一個新OfficeList。你可以用一個ValueConverter來做到這一點,但它會非常黑客。

的清潔解決方案是有一個包含數據的reportParameter一類,加上OfficeList的一個實例,然後綁定到類,而不是綁定到該用戶控件的實例。根據reportParameters的結構(我假設reportParameters是ReportParameter類型的對象列表),有兩種方法可能需要執行此操作:

1)如果ReportParameter是ViewModel,則可以只需將一個OfficeList屬性添加到R​​eportParameter類中,並在實例化每個ReportParameter時對其進行初始化。

然後你TreeView的是這樣的:

<TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" ItemsSource="{Binding Path=OfficeList, Mode=TwoWay}" 
    ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
    ItemContainerStyle="{StaticResource TreeViewItemStyle}"/> 

2)如果ReportParameter不是一個視圖模型(因此它不會是適當補充的OfficeList參數),然後創建一個名爲類似的新類包含2個屬性的ReportParameterViewModel:ReportParameter和OfficeList。不是將您的ListView綁定到ReportParameter列表,而是綁定到ReportParameterViewModel列表。

那麼你的ListView會是這個樣子:

<ListView Panel.ZIndex="0" x:Name="FilterList" Margin="10,0" Grid.Row="2" 
    Grid.ColumnSpan="3" Background="White" ItemTemplateSelector="{StaticResource 
    ReportFilterTemplateSelector}" ItemsSource="{Binding reportParameterViewModels, 
    Mode=TwoWay}" ScrollViewer.CanContentScroll="False"> 

你的TextBlock看起來就像這樣:

<TextBlock Text="{Binding ReportParameter.rpName}" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" /> 

你的TreeView看起來就像這樣:

<TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" ItemsSource="{Binding Path=OfficeList, Mode=TwoWay}" 
    ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
    ItemContainerStyle="{StaticResource TreeViewItemStyle}"/> 
相關問題