刷新TreeViewItem选择更改的DataGrid数据

时间:2016-07-25 20:17:55

标签: c# wpf xaml mvvm datagrid

我能够使用link

实现树视图

现在我已将下面的数据网格附加到它,用于显示区域,人口,时区等城市细节。我可以通过使用示例从树视图中选择城市名称来接收事件IsSelected。但是如何将City模型(Area,Population,TimeZone)的数据绑定到.xaml中的数据网格?我尝试直接使用CityViewModel,但它从不填充data.CityViewModel有一个observableCollection" CityTown"(有像Area,Population,TimeZone等道具)属性叫做#34; CityTowns"当IsSelected被触发时我正在填充。我的Tree View只有Region - >州 - >城市等级。城镇应该以网格显示而不是在树中。

    //DemoWindow.xaml content:
    <TabControl>
          <TabItem Header="Load Towns">
          <StackPanel Orientation="Horizontal">
             <advanced: LoadOnDemandControl/>
             <DataGrid  ItemsSource="{Binding Path=local.CityViewModel.CityTowns}" 
                  AutoGenerateColumns="False" IsReadOnly="True"  
                 >
                   <DataGrid.Columns>
                      <DataGridTextColumn Binding="{Binding Path=Popluation}" Header="Popluation"/>
                      <DataGridTextColumn Binding="{Binding Path=Revenue}" Header="Revenue"/> 
                      <DataGridTextColumn Binding="{Binding Path=TimeZone}" Header="TimeZone"/>
                       <DataGridTextColumn Binding="{Binding Path=Area}" Header="Area"/>
                  </DataGrid.Columns>
            </DataGrid>
          </StackPanel>
        </TabItem>
 </TabControl>

 //LoadOnDemandCcontrol.xaml:
            <TreeView ItemsSource="{Binding Regions}">
          <TreeView.ItemContainerStyle>
            <!-- 
            This Style binds a TreeViewItem to a TreeViewItemViewModel. 
            -->
            <Style TargetType="{x:Type TreeViewItem}">
              <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
              <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
              <Setter Property="FontWeight" Value="Normal" />
              <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                  <Setter Property="FontWeight" Value="Bold" />
                </Trigger>
              </Style.Triggers>
            </Style>
          </TreeView.ItemContainerStyle>

          <TreeView.Resources>
            <HierarchicalDataTemplate 
              DataType="{x:Type local:RegionViewModel}" 
              ItemsSource="{Binding Children}"
              >
              <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16" Margin="3,0" Source="Images\Region.png" />
                <TextBlock Text="{Binding RegionName}" />
              </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate 
              DataType="{x:Type local:StateViewModel}" 
              ItemsSource="{Binding Children}"
              >
              <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16" Margin="3,0" Source="Images\State.png" />
                <TextBlock Text="{Binding StateName}" />
              </StackPanel>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type local:CityViewModel}">
              <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16" Margin="3,0" Source="Images\City.png" />
                <TextBlock Text="{Binding CityName}" />
              </StackPanel>
            </DataTemplate>
          </TreeView.Resources>
        </TreeView>

 //CityTown.cs content:
 public class CityTown
 {
    public int Area { get; set; }
    public int Population { get; set; }
    public string TimeZone { get; set; }
    public int Revenue { get; set; }
    public virtual City City { get; set; }
 }

 //CityViewModel.cs cocntent
public class CityViewModel : TreeViewItemViewModel
{
    readonly City _city;

    public CityViewModel(City city, StateViewModel parentState)
        : base(parentState, false)
    {
        _city = city;
    }

    public string CityName
    {
        get { return _city.CityName; }
    }

    private ObservableCollection<CityTown> _CityTowns;

    public ObservableCollection<CityTown>    CityTowns
    {
        get { return Database.GetTowns(CityName); }
        set { _CityTowns = value; }
    }

}

//LoadOnDemandDemoControl.xaml.cs content:
public partial class LoadOnDemandDemoControl : UserControl
  {
    public LoadOnDemandDemoControl()
    {
        InitializeComponent();

        Region[] regions = Database.GetRegions();
        CountryViewModel viewModel = new CountryViewModel(regions);
        base.DataContext = viewModel;
    }
}

1 个答案:

答案 0 :(得分:0)

我通过为SelectedValuePath xaml元素类定义TreeView属性并在DataGrid元素中使用相同 - &gt;来解决此问题。 ItemsSoruce属性 - &gt; Path - &gt; SelectedItem.ViewModelDataCollection