[英]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.