Привязка к классу в ObservableCollection <T> - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь привязать сетку данных Silverlight к ObservableCollection<T>.

В частности, у меня есть ObservableCollection<Target>, где target имеет следующие свойства: Hierarchy and Item.

Я хочу толькосетка данных для отображения информации для класса Hierarchy, но когда пользователь выбирает строку, я хочу, чтобы свойства Hierarchy и item класса Target были доступны в коде.

Возможно ли это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Укажите пути для свойств иерархии в столбцах, например:

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; }
    }
}
0 голосов
/ 01 августа 2011

Да, это возможно.Сначала установите для AutoGenerateColumns значение false в вашей сетке, затем вручную добавьте столбец для свойства или свойств, которые вы хотите отобразить.Установите ObservableCollection<Target> в качестве ItemsSource для DataGrid.

Когда пользователь выбирает строку, выбранный экземпляр Target будет доступен через свойство DataGrid.SelectedItem, что позволит вам посмотреть навсе его свойства.

...