C# wpf类似excel的网格编辑?

C# wpf类似excel的网格编辑?,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,在一个项目中,我有一个非常棘手的要求,我不知道如何解决: 我在一个wpf窗口中有几个数据网格(我使用MVVM),它们都绑定到链接ViewModel中的某个集合。 客户希望在网格内或公共文本框(如excel)中编辑这些网格中的每一个 我正在绞尽脑汁研究如何做后者。我要做的是用viewmodel中的属性绑定textbox,但是当值在那里更改时,我需要相应地更改与datagrid单元格绑定的原始属性中的值。换句话说,我需要知道什么集合以及该集合的哪个属性需要根据文本框中的数据进行相应的更改 我试了好几

在一个项目中,我有一个非常棘手的要求,我不知道如何解决:

我在一个wpf窗口中有几个数据网格(我使用MVVM),它们都绑定到链接ViewModel中的某个集合。 客户希望在网格内或公共文本框(如excel)中编辑这些网格中的每一个

我正在绞尽脑汁研究如何做后者。我要做的是用viewmodel中的属性绑定textbox,但是当值在那里更改时,我需要相应地更改与datagrid单元格绑定的原始属性中的值。换句话说,我需要知道什么集合以及该集合的哪个属性需要根据文本框中的数据进行相应的更改

我试了好几种方法,但没有成功

反思?依赖财产?还有什么

有什么帮助吗


谢谢

假设您使用的是内置的WPF
数据网格
,您需要以类似方式设置网格:

    <DataGrid SelectionUnit="Cell" SelectionMode="Single" ItemsSource="{Binding Data}" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged">
        ...
    </DataGrid>
在代码隐藏中,您需要手动连接此事件,因为显然
DataGrid
不允许您在使用
SelectionUnit=“cell”
时绑定到所选项目/单元格/值:


我尝试在不使用代码的情况下完成此操作,但环顾四周后,这似乎是不可能的。

除了TencTraze答案之外,我还使用此代码将te属性绑定到单元格

var property = (selectedCell.Column.ClipboardContentBinding as Binding).Path.Path;

这还是有点模糊。您的意思是希望将外部文本框绑定到网格上的特定值,以便当用户单击该网格中的单元格时,文本框的值将绑定到该单元格?是的,每当用户单击单元格时,该值将绑定到文本框,当用户在文本框中更改该值时,更改将反映到该单元格(当然还有在viewmodel中绑定到它的对象)谢谢,我找到了相同的解决方案。无论如何,我不认为这是对MVVM模式的“违反”,因为这是纯视图逻辑。如果我改变视图技术,我可以在不影响viewmodel逻辑的情况下删除此代码(最重要的是)我在视图模型中没有任何对任何视图特定类(例如SelecedCellChangedEventArgs)的引用。
private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    if (e.AddedCells.Count == 0)
        this.textBox.SetBinding(TextBox.TextProperty, (string) null);
    else
    {
        var selectedCell = e.AddedCells.First();

        // Assumes your header is the same name as the field it's bound to
        var binding = new Binding(selectedCell.Column.Header.ToString())
        {
            Mode = BindingMode.TwoWay,
            Source = selectedCell.Item,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };
        this.textBox.SetBinding(TextBox.TextProperty, binding);
    }
}
var property = (selectedCell.Column.ClipboardContentBinding as Binding).Path.Path;