【问题标题】:wpf excel like grid editing?wpf excel喜欢网格编辑?
【发布时间】:2014-02-06 21:10:05
【问题描述】:

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

我在单个 wpf 窗口(我使用 MVVM)中有多个数据网格,它们都绑定到链接 ViewModel 中的某个集合。 客户想要编辑这些网格中的每一个,无论是在网格内还是在通用文本框中(如在 excel 中)。

我正在研究如何做后者。我要做的是将文本框与视图模型中的属性绑定,但是当在那里更改值时,我需要相应地更改与数据网格单元绑定的原始属性中的值。换句话说,我需要知道我需要根据文本框中的数据相应地更改哪个集合以及该集合的哪个属性。

我尝试了几种方法,但都没有成功。

反思?依赖属性?还有什么?

有什么帮助吗?

谢谢

【问题讨论】:

  • 这还是有点模糊。您是说要将外部文本框绑定到网格上的特定值,以便当用户单击该网格中的单元格时,文本框的值会绑定到它?
  • 是的,只要用户单击一个单元格,该值就绑定到文本框,当他在文本框中更改它时,更改会反映到单元格(当然还有绑定到它的对象)视图模型)

标签: c# wpf mvvm datagrid


【解决方案1】:

假设您使用的是内置 WPF DataGrid,您需要类似地设置网格:

    <DataGrid SelectionUnit="Cell" SelectionMode="Single" ItemsSource="{Binding Data}" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged">
        ...
    </DataGrid>

同时给你的TextBox 起个名字:

<TextBox x:Name="textBox" DockPanel.Dock="Top" />

在代码隐藏中,您需要手动连接此事件,因为显然DataGrid 不允许您在使用SelectionUnit="Cell" 时绑定到选定的项目/单元格/值:

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

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

【讨论】:

  • 谢谢,我找到了同样的解决方案。无论如何,我不认为这是对 MVVM 模式的“违反”,因为这是纯视图逻辑。如果我要更改视图技术,我可以在不以任何方式影响视图模型逻辑的情况下摆脱此代码,并且(最重要的是)我对视图模型中的任何视图特定类(例如 SelectedCellChangedEventArgs)没有任何参考。跨度>
【解决方案2】:

除了tencntraze 答案之外,我还使用此代码来获取绑定到单元格的属性

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多