【问题标题】:Bind to a class within ObservableCollection<T>绑定到 ObservableCollection<T> 中的类
【发布时间】:2011-10-17 10:47:06
【问题描述】:

我正在尝试将 Silverlight Datagrid 绑定到 ObservableCollection&lt;T&gt;

具体来说,我有ObservableCollection&lt;Target&gt;,其中目标具有以下属性:层次结构和项目。

我只希望数据网格显示 Hierarchy 类的信息,但是当用户选择一行时,我希望 Target 类的 Hierarchy 和 item 属性在代码中都可用。

这可能吗?

谢谢。

【问题讨论】:

    标签: silverlight data-binding observablecollection


    【解决方案1】:

    是的,这是可能的。首先,在您的网格上将AutoGenerateColumns 设置为false,然后手动为您希望显示的一个或多个属性添加一列。将您的ObservableCollection&lt;Target&gt; 设置为您的DataGridItemsSource

    当用户选择一行时,选定的Target 实例将通过DataGrid.SelectedItem 属性提供,允许您查看其所有属性。

    【讨论】:

      【解决方案2】:

      为列中的层次结构属性指定路径,如下所示:

      Binding="{Binding Hierarchy.Title}"
      

      下面的完整示例:

      MainPage.xaml

      <UserControl x:Class="GridBinding.MainPage"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          mc:Ignorable="d"
          d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
      
          <Grid x:Name="LayoutRoot" Background="White">
              <sdk:DataGrid ItemsSource="{Binding Targets}" AutoGenerateColumns="False" Name="dataGrid1" SelectionChanged="dataGrid1_SelectionChanged">
                  <sdk:DataGrid.Columns>
                      <sdk:DataGridTextColumn Header="Title" Binding="{Binding Hierarchy.Title}" Width="Auto" />
                      <sdk:DataGridTextColumn Header="Text" Binding="{Binding Hierarchy.Text}" Width="Auto" />
                  </sdk:DataGrid.Columns>
              </sdk:DataGrid>
          </Grid>
      </UserControl>
      

      MainPage.cs

      using System.Collections.ObjectModel;
      using System.Windows.Controls;
      
      namespace GridBinding
      {
          public partial class MainPage : UserControl
          {
              public ObservableCollection<Target> Targets { get; set; }
      
              public MainPage()
              {
                  InitializeComponent();
                  this.Targets = new ObservableCollection<Target>()
                                  {
                                      new Target(){ Hierarchy = new Hierarchy(){Text = "Text 1", Title = "Title 1"}, Item = new Item(){Name = "Name 1"}},
                                      new Target(){ Hierarchy = new Hierarchy(){Text = "Text 2", Title = "Title 2"}, Item = new Item(){Name = "Name 2"}},
                                      new Target(){ Hierarchy = new Hierarchy(){Text = "Text 3", Title = "Title 3"}, Item = new Item(){Name = "Name 2"}},
                                  };
                  this.DataContext = this;
              }
      
              private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
              {
                  DataGrid dataGrid = sender as DataGrid;
                  Target target = dataGrid.SelectedItem as Target;
                  Hierarchy heirarchy = target.Hierarchy;
                  Item item = target.Item;
              }
          }
      
          public class Target
          {
              public Hierarchy Hierarchy { get; set; }
              public Item Item { get; set; }
          }
      
          public class Hierarchy
          {
              public string Title { get; set; }
              public string Text { get; set; }
          }
      
          public class Item
          {
              public string Name { get; set; }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        相关资源
        最近更新 更多