将附加列与datagrid WPF中的任何控件绑定

时间:2015-08-10 07:07:42

标签: c# wpf xaml wpf-controls wpfdatagrid

我有一个要求是使用WPF C#在datagrid中的“listview”或“datagrid”中绑定其他列。

基本数据网格我有如下

xcopy C:\Users\t\Desktop\survival\world "C:\Users\t\Desktop\backups\survival\Backup-%date:/=-%_%time:~0,2%.%time:~3,2% /s /e /i

对于上述<table border="1" width="100%"> <tr> <td>Item Id</td> <td>Item Name</td> <td>Quantity</td> <td>Price</td> </tr> <tr> <td>500</td> <td>Sanwich</td> <td>2</td> <td>10</td> </tr> </table>我的datagrid代码,如下所示。

XAML

我在代码后面的代码如下按钮点击事件:

<DataGrid Grid.Column="1" Margin="8,60,8,16"AutoGenerateColumns="False" Height="350"
     HorizontalAlignment="Left" Name="gridOrderDetails" VerticalAlignment="Top" Width="450" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Item ID" Binding="{Binding itemId}" />                                        

        <DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" />
        <DataGridTextColumn Header="Item Name" Binding="{Binding comments}" />
        <DataGridTextColumn Header="Item Price" Binding="{Binding ItemPrice}" />
    </DataGrid.Columns>
</DataGrid>

我想要的输出如下

private void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        DBDataContext dbContext = new DBDataContext();
        SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;

        gridOrderDetails.ItemsSource = dbContext.SP_Get_ItemList(orderRow.orderid);
    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
        return;
    }
}

要实现此目标<table border="1" width="100%"> <tr> <td>Item Id</td> <td>Item Name</td> <td>Additionals</td> <td>Quantity</td> <td>Price</td> </tr> <tr> <td>500</td> <td>Sanwich</td> <td>Egg<p class="MsoNormal" style="margin-left:0in">Ketchup</p> <p> <span style="font-size: 11.0pt; line-height: 115%; font-family: Calibri,sans-serif"> Salad</span></td> <td>2</td> <td>10</td> </tr> </table>,我使用datagrid编写了我的XAML代码,如下所示。

DataGridTemplateColumn

在后面的代码中,我尝试使用<DataGrid Grid.Column="1" Margin="8,60,8,16"AutoGenerateColumns="False" Height="350" HorizontalAlignment="Left" Name="gridOrderDetails" VerticalAlignment="Top" Width="450" LoadingRow="gridOrderDetails_LoadingRow"> <DataGrid.Columns> <DataGridTextColumn Header="Item ID" Binding="{Binding itemId}" /> <DataGridTextColumn Header="Item Name" Binding="{Binding ItemName}" /> <DataGridTemplateColumn Header="Addtionals"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <DataGrid AutoGenerateColumns="False" Name="gridAdditionals" > <DataGridTextColumn Header="Additional" Binding="Additionals"></DataGridTextColumn> </DataGrid> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" /> <DataGridTextColumn Header="Comments" Binding="{Binding comments}" /> <DataGridTextColumn Header="Item Price" Binding="{Binding ItemPrice}" /> </DataGrid.Columns> </DataGrid> 事件,但无法从单元格值传递相应的LoadingRow

ItemID

我想我使用的逻辑是错误的。这可以使用Asp.net C#中的private void gridOrderDetails_LoadingRow(object sender, DataGridRowEventArgs e) { DCAPPDBDataContext dbContext = new DCAPPDBDataContext(); DataGrid grid = FindChild<DataGrid>(gridOrderDetails, "gridAdditionals"); grid.ItemsSource = dbContext.SP_Get_AdditionalsList(500); } 来实现。 任何人都可以帮我解决如何在WPF C#中执行此操作。

2 个答案:

答案 0 :(得分:1)

使用WPF时,它适合遵循MVVM模式。无论哪种方式,您都应该为Order定义一个合适的类(即视图模型)(包含Id,Name,Quantity等属性...)。此类还应具有Aditionals的属性(例如strings的集合)。然后,通过使用正确的DataBindings,您将实现所需的功能。

这是一个给你一个想法的工作示例:

订单类:

public class Order : INotifyPropertyChanged
{
    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    public Order(int id)
    {
        DBDataContext dbContext = new DBDataContext();
        DCAPPDBDataContext dbContext2 = new DCAPPDBDataContext();

        var itemsSource = dbContext.SP_Get_ItemList(id);
        var additionals = dbContext2.SP_Get_AdditionalsList(id);

        Id = id;
        Name = itemsSource.name;
        Quantity = itemsSource.quantity;
        // other properties ...

        Additionals = new ObservableCollection<string>();
        foreach (var item in additionals)
        {
            Additionals.Add(item);
        }
    }

    private int _id;
    public int Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

    // define other properties e.g. Name, Quantity, Price, etc.
    // the same way as Id.

    public ObservableCollection<string> Additionals {get;set;}
}

<强>的Xaml:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <DataGrid Grid.Row="0" AutoGenerateColumns="False"
          ItemsSource="{Binding Orders}" 
          SelectedItem="{Binding SelectedOrder}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Item ID" Binding="{Binding Id}" />
        <DataGridTextColumn Header="Item Name" Binding="{Binding Name}" />
        <DataGridTemplateColumn Header="Addtionals">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                        <ItemsControl ItemsSource="{Binding Additionals}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding}"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
        <DataGridTextColumn Header="Item Price" Binding="{Binding Price}" />
    </DataGrid.Columns>
</DataGrid>
<Button  Grid.Row="1" Content="New Order" Click="Order_Click"/>
</Grid>

<强> MainWindow.cs:

    public ObservableCollection<Order> Orders { get; set; }

    public Order SelectedOrder { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        Orders = new ObservableCollection<Order>();

    }

    private void Order_Click(object sender, RoutedEventArgs e)
    {
        SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
        Orders.Add(new Order(orderRow.orderid));
    }

答案 1 :(得分:1)

在Bahman_Aries帖子的帮助下,我发布了一些确切的解决方案。 这是我想要的精确解决方案。

订单类:

public class Order : INotifyPropertyChanged
{
    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    public Order(SP_Get_ItemListResult itemResult)
    {
        DBDataContext dbContext = new DBDataContext();                


         orderItemID = itemResult.orderItemID;
        itemName = itemResult.ItemName;
        quantity = itemResult.quantity;           
        // other properties ...

      var additionals = dbContext.SP_Get_AdditionalsList(orderItemID);

        Additionals = new ObservableCollection<string>();
        foreach (var item in additionals)
        {
            Additionals.Add(item.Additionals);
        }
    }

    private int _id;
    public int Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

    // define other properties e.g. Name, Quantity, Price, etc.
    // the same way as Id.

    public ObservableCollection<string> Additionals {get;set;}
}

XAML代码没有变化。

<强> MainWindow.cs:

public ObservableCollection<Order> Orders { get; set; }

public Order SelectedOrder { get; set; }

public MainWindow()
{
    InitializeComponent();
    DataContext = this;

    Orders = new ObservableCollection<Order>();

}

private void Order_Click(object sender, RoutedEventArgs e)
{
    SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
      List<SP_Get_ItemListResult> itemsSource = dbContext.SP_Get_ItemList(orderRow.orderid).ToList();
            for (int i = 0; i < itemsSource.Count(); i++)
            {
                Orders.Add(new Order(itemsSource[i]));
            }         
}