2012-07-15 33 views
0

我有兩列:left包含2級TreeView供應商/類別和包含DataGrid產品的權利。我想單擊TreeView層次結構(供應商或類別),並根據所選供應商或類別刷新DataGrid,換句話說,應該只顯示屬於選定供應商或類別的產品。 的代碼看起來像這樣:如何從TreeView動態刷新DataGrid

<Window x:Class="Replen.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:Replen" 
    Title="North Reports" Height="550" Width="1180"> 
<Window.Resources> 
    <ObjectDataProvider IsAsynchronous="True" x:Key="productNorthProvider" ObjectType=" {x:Type local:ProductNorthDB}" MethodName="GetProductNorthList"> 
     <ObjectDataProvider.MethodParameters> 
      <sys:String>1</sys:String> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="220" /> 
     <ColumnDefinition Width="5" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="300"/> 
     <RowDefinition Height="5"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <GridSplitter VerticalAlignment="Stretch" 
       HorizontalAlignment="Stretch" ShowsPreview="True" 
       Grid.Column="1" Grid.RowSpan="3" ResizeBehavior="PreviousAndNext" 
       Width="5" Background="LightSteelBlue" /> 
    <GridSplitter VerticalAlignment="Stretch" 
       HorizontalAlignment="Stretch" ShowsPreview="True" 
       Grid.Row="1" Grid.ColumnSpan="3" ResizeBehavior="PreviousAndNext" 
       Height="5" Background="LightSteelBlue"/> 
    <Border Grid.Column="0" Grid.Row="0" Padding="0" Margin="0" Background="LightSteelBlue" Grid.RowSpan="3"> 
     <TreeView Name="treeSuppliersCategories" Margin="5, 5, 0, 5" FontSize="12" Grid.RowSpan="2"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding SupplierCategoryNorth}"> 
        <TextBlock Text="{Binding SupplierNorthName}" Padding="2"/> 
        <HierarchicalDataTemplate.ItemTemplate > 
         <DataTemplate > 
          <TextBlock Name="categoryCode" VerticalAlignment="Center">    
           <TextBlock.Text> 
            <MultiBinding StringFormat=" {0} {1}"> 
             <Binding Path="CategoryNorthCode" /> 
             <Binding Path="CategoryNorthName"/> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
         </DataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </Border>   
    <Border Grid.Column="2" Grid.Row="0" Padding="0" Margin="0" Background="LightSteelBlue"> 
     <DataGrid Grid.Column="2" Grid.Row="2" x:Name="gridProductsNorth" Margin="0, 5, 5, 0" AutoGenerateColumns="False" 
        ItemsSource="{Binding Source={StaticResource productNorthProvider}}" IsReadOnly="True"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Product" Width="60" Binding="{Binding Path=ProductNorthCode}"></DataGridTextColumn> 
       <DataGridTextColumn Header="Product Name" Width="160" Binding="{Binding Path=ProductNorthName}" ></DataGridTextColumn> 
       <DataGridTextColumn Header="Supplier" Width="60" Binding="{Binding Path=SupplierNorthCode}"></DataGridTextColumn> 
       <DataGridTextColumn Header="Supplier Name" Width="160" Binding="{Binding Path=SupplierNorthName}"></DataGridTextColumn> 
       <DataGridTextColumn Header="Category" Width="60" Binding="{Binding Path=CategoryNorthCode}" ></DataGridTextColumn> 
       <DataGridTextColumn Header="Category Name" Width="100" Binding="{Binding Path=CategoryNorthName}" ></DataGridTextColumn> 
       <DataGridTextColumn Header="Unit Price" Width="70" Binding="{Binding Path=UnitPrice}"></DataGridTextColumn> 
       <DataGridTextColumn Header="In Stock" Width="70" Binding="{Binding Path=UnitsInStock}"></DataGridTextColumn> 
       <DataGridTextColumn Header="On Order" Width="70" Binding="{Binding Path=UnitsOnOrder}"></DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Border> 
</Grid> 
</Window>} 

數據來自SQL Server數據庫。我很感謝你的幫助。 很多謝謝

回答

0

您的解決方案似乎直接將模型綁定到視圖。

您應該調查MVVM模式。

當在TreeView改變你的選擇的項目,你可以直接改變 數據網格(即爲其提供其他數據)

MVVM解耦你從你的模型查看:

型號< - >視圖模型< - >查看

選擇在視圖中更改,ViewModel獲取通知(SelectedItem已更改), ViewModel可以使用來自模型的新數據更新視圖。在你的案例 中,通過更改網格的ViewModel,將會更改數據網格中的產品。

這裏是MVVM一個很好的視頻教程: Jason Dollinger on MVVM

他在本教程中開發的源代碼也可以: Source code on Lab49

+0

感謝馬無限極的建議MVVM。我顯然會在未來看到它。有沒有其他解決方案可以適用於我目前的案例?即使你建議MVVM在這種情況下可能會更好,我相信還有另一種方法來處理這個問題。 – Leszek 2012-07-15 09:07:47

+0

有許多方法可以解決這個問題。 MVVM對我來說只是最快和最可維護的方法。 – 2012-07-15 09:10:50