获取绑定到 LINQ 查询结果的 DataGrid 中 DataGridTemplateColumn 的编辑值
Getting edited value of DataGridTemplateColumn in DataGrid bound to LINQ query results
我有一个带有数据网格的 WPF 应用程序,我将其绑定到我的 ViewModel 中的自定义 LINQ to SQL 查询,该查询汇集了来自两个不同 tables:
的列
public ICollectionView SetsView { get; set; }
public void UpdateSetsView()
{
var sets = (from s in dbContext.Sets
join o in dbContext.SetParts on s.ID equals o.SetID into g1
select new
{
s.ID,
s.SetNumber,
s.SetTitle,
s.SetType,
s.SetNotes,
s.SetUrl,
s.HaveAllParts,
s.NumberOfSets,
s.IsBuilt,
s.DateAdded,
s.LastModified,
UniqueParts = g1.Count(),
TotalParts = g1.Sum(o => o.Quantity)
}
);
SetsView = CollectionViewSource.GetDefaultView(sets);
}
SetsView 集合绑定到我的数据网格,因为我需要能够编辑任何行的 SetNotes 值并将其保存回我数据库中的集合 table,我添加了一个事件处理程序CellEditEnding ( CellEditEnding="dgST_Sets_CellEditEnding") 到 DataGrid 定义并创建此列:
<DataGridTemplateColumn Header="Set Notes"
SortMemberPath="SetNotes"
Width="*">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SetNotes, Mode=OneWay}" Margin="5,0,5,0"
HorizontalAlignment="Stretch" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding SetNotes, Mode=OneWay}" Margin="5,0,5,0"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
问题是,当我 运行 应用程序并在任何行中编辑“设置注释”列时,我无法弄清楚如何从事件参数中获取已编辑单元格的新值。我以为我可以将事件参数 EditingElement 实例转换为 TextBox(请参阅下面的处理程序)但是当我 运行 应用程序编辑一行并更改 SetNotes 的值时,EditingElement 的类型是 ContentPresenter 而不是 TextBox 并且终生我不知道如何获得更改后的值。
private void dgST_Sets_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
string newValue = ((TextBox)e.EditingElement).Text;
//Code here to update table
}
请记住,我正在绑定到自定义 LINQ to SQL 查询,因此这不是典型的模型绑定问题。另请注意,当在我的模板列中绑定 SetNotes 的值时,我别无选择,但使用 Mode=OneWay 因为使用任何其他选项都会给我 运行 有关访问只读 属性 的时间错误 - 这会以某种方式是问题吗?
我在这上面花了好几个小时,没完没了地用谷歌搜索,没有任何乐趣 - 谁能帮帮我?
这应该有效:
private void dgST_Sets_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
ContentPresenter cp = e.EditingElement as ContentPresenter;
if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0)
{
TextBox textBox = VisualTreeHelper.GetChild(cp, 0) as TextBox;
if (textBox != null)
{
string newValue = textBox.Text;
}
}
}
我有一个带有数据网格的 WPF 应用程序,我将其绑定到我的 ViewModel 中的自定义 LINQ to SQL 查询,该查询汇集了来自两个不同 tables:
的列public ICollectionView SetsView { get; set; }
public void UpdateSetsView()
{
var sets = (from s in dbContext.Sets
join o in dbContext.SetParts on s.ID equals o.SetID into g1
select new
{
s.ID,
s.SetNumber,
s.SetTitle,
s.SetType,
s.SetNotes,
s.SetUrl,
s.HaveAllParts,
s.NumberOfSets,
s.IsBuilt,
s.DateAdded,
s.LastModified,
UniqueParts = g1.Count(),
TotalParts = g1.Sum(o => o.Quantity)
}
);
SetsView = CollectionViewSource.GetDefaultView(sets);
}
SetsView 集合绑定到我的数据网格,因为我需要能够编辑任何行的 SetNotes 值并将其保存回我数据库中的集合 table,我添加了一个事件处理程序CellEditEnding ( CellEditEnding="dgST_Sets_CellEditEnding") 到 DataGrid 定义并创建此列:
<DataGridTemplateColumn Header="Set Notes"
SortMemberPath="SetNotes"
Width="*">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SetNotes, Mode=OneWay}" Margin="5,0,5,0"
HorizontalAlignment="Stretch" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding SetNotes, Mode=OneWay}" Margin="5,0,5,0"
HorizontalAlignment="Stretch" VerticalAlignment="Center"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
问题是,当我 运行 应用程序并在任何行中编辑“设置注释”列时,我无法弄清楚如何从事件参数中获取已编辑单元格的新值。我以为我可以将事件参数 EditingElement 实例转换为 TextBox(请参阅下面的处理程序)但是当我 运行 应用程序编辑一行并更改 SetNotes 的值时,EditingElement 的类型是 ContentPresenter 而不是 TextBox 并且终生我不知道如何获得更改后的值。
private void dgST_Sets_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
string newValue = ((TextBox)e.EditingElement).Text;
//Code here to update table
}
请记住,我正在绑定到自定义 LINQ to SQL 查询,因此这不是典型的模型绑定问题。另请注意,当在我的模板列中绑定 SetNotes 的值时,我别无选择,但使用 Mode=OneWay 因为使用任何其他选项都会给我 运行 有关访问只读 属性 的时间错误 - 这会以某种方式是问题吗?
我在这上面花了好几个小时,没完没了地用谷歌搜索,没有任何乐趣 - 谁能帮帮我?
这应该有效:
private void dgST_Sets_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
ContentPresenter cp = e.EditingElement as ContentPresenter;
if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0)
{
TextBox textBox = VisualTreeHelper.GetChild(cp, 0) as TextBox;
if (textBox != null)
{
string newValue = textBox.Text;
}
}
}