WPF:如何使 DataGrid 与动态列的绑定可编辑?

2023-12-13

我需要将一些数据绑定到具有可变列数的 DataGrid。我使用以下代码使其工作:

int n = 0;
foreach (string title in TitleList)
{
    DataGridTextColumn col = new DataGridTextColumn();
    col.Header = title;
    Binding binding = new Binding(string.Format("DataList[{0}]", n++));
    binding.Mode = BindingMode.TwoWay;
    col.Binding = binding;
    grid.Columns.Add(col);
}

其中 DataList 声明为:

public ObservableCollection<double> DataList { get; set; }

TitleList 声明为:

public ObservableCollection<string> TitleList { get; set; }

问题是,尽管我指定了 TwoWay 绑定,但它实际上是单向的。当我单击单元格尝试编辑时,出现异常“此视图不允许'EditItem'”。我是否错过了绑定表达式中的某些内容?

附:我找到了黛博拉的一篇文章“使用 MVVM 在 Silverlight 应用程序中使用动态列填充 DataGrid”。但是,我很难让它适合我的情况(具体来说,我无法使标头绑定工作)。即使它有效,我仍然面临诸如单元格样式不一致之类的问题。这就是为什么我想知道是否可以让我的上面的代码工作——稍微调整一下?

编辑:我发现另一篇文章可能与我的问题有关:隐式双向绑定。它看起来是否使用绑定到文本框的字符串列表

<TextBox Text="{Binding}"/>

您将收到类似“双向绑定需要 Path 或 XPath”的错误。但问题可以通过使用轻松解决

<TextBox Text="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"/>

or

<TextBox Text="{Binding .}"/>

如果我的问题可以以类似的方式解决,有人可以给我提示吗?


您绑定到索引器吗?您可以向我们展示您的 DataList 属性是什么样子吗?

我不久前对索引属性也做了同样的事情。

 public SomeObjectWithIndexer DataList
 {get; set;}


 public class SomeObjectWithIndexer 
 {
      public string this
      {
          get { ... }
          set { ... }//<-- you need this one for TwoWay
      }
 }

编辑:您无法编辑属性的原因是您尝试编辑“双字段”。 一种解决方法是将您的双精度数包装到带有 INotifyPropertyChanged 的​​类中。

public class DataListItem
{
    public double MyValue { get; set;}//with OnPropertyChanged() and stuff
}

那么你可以使用

ObservableCollection<DataListItem>

您可以编辑您的值。索引是否始终相同的问题仍然存在:)

Binding binding = new Binding(string.Format("DataList[{0}].MyValue", n++));

EDIT2:工作示例:只是为了显示twoway正在工作

public class DataItem
{
    public string Name { get; set; }
    public ObservableCollection<DataListItem> DataList { get; set; }

    public DataItem()
    {
        this.DataList = new ObservableCollection<DataListItem>();
    }
}

双包装:

public class DataListItem
{
    private double myValue;
    public double MyValue
    {
        get { return myValue; }
        set { myValue = value; }//<-- set breakpoint here to see that edit is working
    }
}

带有数据网格的用户控件

<UserControl x:Class="WpfStackoverflow.IndexCollectionDataGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
        <DataGridTextColumn Header="Index1" Binding="{Binding Path=DataList[0].MyValue, Mode=TwoWay}" />
        <DataGridTextColumn Header="Index2" Binding="{Binding Path=DataList[1].MyValue, Mode=TwoWay}" />
    </DataGrid.Columns>
</DataGrid>
</UserControl>

.cs

public partial class IndexCollectionDataGrid : UserControl
{
    public IndexCollectionDataGrid()
    {
        InitializeComponent();
        this.MyList = new ObservableCollection<DataItem>();

        var m1 = new DataItem() {Name = "test1"};
        m1.DataList.Add(new DataListItem() { MyValue = 10 });
        m1.DataList.Add(new DataListItem() { MyValue = 20 });

        var m2 = new DataItem() { Name = "test2" };
        m2.DataList.Add(new DataListItem() { MyValue = 100 });
        m2.DataList.Add(new DataListItem() { MyValue = 200 });

        this.MyList.Add(m1);
        this.MyList.Add(m2);

        this.DataContext = this;
    }

    public ObservableCollection<DataItem> MyList { get; set; }
}

我希望你通过这个例子找到正确的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:如何使 DataGrid 与动态列的绑定可编辑? 的相关文章

  • C#:将音频文件从服务器流式传输到客户端

    我目前正在编写一个应用程序 该应用程序将允许用户安装某种形式的应用程序 可能是 Windows 服务 该应用程序将在其 PC 上打开一个端口 并在硬盘上指定一个特定的目的地 然后能够流式传输 mp3 文件 然后 我将有另一个应用程序 该应用
  • 从代码访问 WPF 控件验证规则

    XAML
  • 为什么在此 MultiBinding 上未调用 ConvertBack?

    我的组合框列表联系人使用 MultiBinding 绑定到 FullName 和 PhoneExtension IMul tiValueConverter 的 Convert 方法被调用 但 ConvertBack 未被调用 为什么 组合框
  • 从 StaticResource 设置 RowDefinition 高度

    在我的 WPF 样式中 我定义了一个标准网格行高 我想将其应用到几个地方 如下所示
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W
  • WPF ListBoxItem 双击?

    WPF ListBox 没有 DoubleClick 事件 至少据我所知没有 是否有针对此问题的解决方法 让我双击某个项目即可让事件处理程序对其执行某些操作 感谢您的帮助 可以将带有参数的命令绑定到ListBoxItem不使用代码隐藏 or
  • 列表元素之间的 Tab WPF

    我有一个列表框 其中每个项目都使用文本框表示 问题是我希望能够在移动到 xaml 窗口中的下一个元素之前在列表框中的所有项目之间进行切换 当前 和正常的 WPF 行为 是 当我按 Tab 键进入列表框时 第一个元素会突出显示 如果我再次按
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • Codeigniter:使用数据网格

    我正在寻找使用 CI 实现数据网格 如果使用 ajax 会更好 在Google上搜索我发现了很多关于如何使用的教程和讨论Flexigrid 4 CI or jqGrid 无论如何 我仍然对哪一个可以提供更大的灵活性感到困惑 例如 是否可以设
  • 绑定 Ember TextField 中的计算属性

    我正在尝试将我的数据模型绑定到 Ember js 中的文本字段 该模型有一个表示货币值的字段 例如 1 000 50 然后用户可以更改该值 Ember 接收数字 1000 50 形式的数据 非货币格式 我将视图绑定到具有良好格式的计算属性
  • 过滤绑定到 ItemsControl 的 ICollectionView

    我想制作一个 WPF 应用程序来浏览菜肴食谱 过滤数据时遇到问题 我正在使用 ItemsControl 使我的数据在窗口中看起来像 图块 现在我想用 TextBox 过滤它 但我不知道出了什么问题 这是我的 XAML 绑定
  • 使用资源进行主题化,无需 Blend 呕吐

    WPF 的伟大之处在于 我应该能够在整个应用程序中使用 StaticResource MyBackground 而不是 White 然后通过更改资源定义重新定义整个应用程序的外观 问题是如果您在子控件中引用了全局资源 Expression
  • 如何将外部程序集的类型添加到工具箱控件? (WPF)

    我正在尝试在我的 WPF 应用程序中执行类似的操作 ToolboxControl ctrl new ToolboxControl Assembly assembly Assembly LoadFile file var category n
  • wpf 控件宽度绑定

    我有两个带有内容的边框 第二个边框宽度根据情况而变化 在内容上 我试图将第一个边框绑定到第二个边框宽度 但是 它不起作用 我不确定我错过了什么 有人可以给我一些指导吗 下面是我目前正在尝试的示例
  • 如何使用C#在WPF上的图像控件中显示位图图像

    我希望当我双击其中的一行时ListView 它应该显示Image对应于该行 该行还包含Image 我尝试了以下但显示相同Image对于所有行 因为我已经给出了特定的路径Image private void ListViewEmployeeD
  • WPF DataGrid - 将 TimeSeries 与 MultiBinding 相结合,丢失更改通知。为什么?

    我有一个具有两个 ObservableCollection 的类 其中 TimeValue 是带有更改通知的自定义日期时间 值配对 通过 INotifyPropertyChanged 我将这些称为 目标 和 实际值 当我将它们绑定到图表时
  • 基于动态资源的样式

    看来这样的事情是不允许的 有什么解决办法吗
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 从 DataGridColumn 中绑定到 DataContext 属性

    财产Foo在我的DataContext ViewModel Visibility Foo 但我不知道如何访问Foo里面一个Column 在这种情况下 我认为它可能正在寻找Foo在任何绑定到的对象中DataGrid ItemsSource
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某

随机推荐