簡體   English   中英

將附加列與datagrid WPF中的任何控件綁定

[英]Binding additional column with any control in datagrid WPF

我有一個要求使用WPF C#在datagrid內的“ listview”或“ datagrid”中綁定其他列。

我有以下基本數據網格

 <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我使用DataGridTemplateColumn編寫了如下的XAML代碼。

<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

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);
} 

我猜我使用的邏輯是錯誤的。 這可以使用Asp.net C#中的ItemDataBound實現。 誰能幫助我在WPF C#中執行此操作。

使用WPF最好遵循MVVM模式。 無論哪種方式,您都應該為Order定義一個適當的類(即視圖模型)(包含ID,名稱,數量等屬性)。 該類還應具有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));
    }

借助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]));
            }         
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM