获取DataGrid中DataGridTemplateColumn的编辑值绑定到LINQ查询结果

问题描述 投票:0回答:1

我有一个带有datagrid的WPF应用程序,我绑定到我的ViewModel中的自定义LINQ to SQL查询,它将来自两个不同表的列汇集在一起​​:

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集合绑定到我的datagrid,因为我需要能够为任何行编辑SetNotes的值并将其保存回我的数据库中的Sets表,我为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>

问题是,当我运行应用程序并编辑任何行中的“设置备注”列时,我无法确定如何从事件args获取已编辑单元格的新值。我以为我可以将事件args 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,因为使用任何其他选项会给我带来有关访问只读属性的运行时错误 - 这可能是某种程度上的问题吗?

我花了好几个小时在这上面无休止地搜索,没有任何快乐 - 有人可以帮助我吗?

wpf data-binding linq-to-sql wpfdatagrid
1个回答
1
投票

这应该工作:

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.