Как привязать SelectedItem древовидного представления через источник данных к сетке данных - PullRequest
1 голос
/ 02 февраля 2012

Мне нужно привязать выбранный элемент дерева (на самом деле источник данных) к сетке данных.

F.ex.У меня есть список чеков, а под одной квитанцией - список чеков.Я хотел бы связать эти элементы с сеткой данных, когда квитанция выбрана из древовидного списка.

В сетке данных элементы квитанции будут редактироваться, поэтому значения должны быть привязаны к фактическому источнику данных.

Как это сделать

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Привязать источник данных вашей DataGrids к выбранной квитанции в дереве:

  <TreeView x:Name="ReceiptsTree" ItemsSource="{Binding Receipts}"/>


  <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=ReceiptsTree, Path=SelectedItem.ReceiptItems}">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Receipt Name" Binding="{Binding Name}" />
      .... 
    </DataGrid.Columns>
  </DataGrid>
1 голос
/ 02 февраля 2012

Этот пример делает все по сути (с небольшой помощью SvenG в соответствии с DataGrid).

Window.xaml:

<Window x:Class="WpfSOTreeviewSelectedItem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TreeView Name="tvReceipts" Grid.Column="0">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}"></TextBlock>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        <DataGrid AutoGenerateColumns="False" Grid.Column="1" ItemsSource="{Binding ElementName=tvReceipts, Path=SelectedItem.Items}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Ingredient" Binding="{Binding Name}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Код позади главного окна:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Receipt> list = new List<Receipt>();

        Receipt r;
        r = new Receipt() { Name = "Pizza" };
        list.Add(r);

        ReceiptItem ri;
        ri = new ReceiptItem() { Name = "Tomatoes" };
        r.Items.Add(ri);
        ri = new ReceiptItem() { Name = "Herbs" };
        r.Items.Add(ri);

        r = new Receipt() { Name = "Tortellini" };
        list.Add(r);
        ri = new ReceiptItem() { Name = "Flower" };
        r.Items.Add(ri);
        ri = new ReceiptItem() { Name = "Meat" };
        r.Items.Add(ri);

        r = new Receipt() { Name = "Tarte Tatin" };
        list.Add(r);
        ri = new ReceiptItem() { Name = "Apples" };
        r.Items.Add(ri);
        ri = new ReceiptItem() { Name = "Raisins" };
        r.Items.Add(ri);

        tvReceipts.ItemsSource = list;
    }
}

public class Receipt
{
    private String _name;
    public String Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private List<ReceiptItem> _items = new List<ReceiptItem>();
    public List<ReceiptItem> Items
    {
        get { return _items; }
        set { _items = value; }
    }
}

public class ReceiptItem
{
    private String _name;
    public String Name
    {
        get { return _name; }
        set { _name = value; }
    }
}
...