【问题标题】:How can I allow a user to change values in a XAML datagrid?如何允许用户更改 XAML 数据网格中的值?
【发布时间】:2016-12-23 12:43:50
【问题描述】:

我有一个包含 8 列数据网格的 XAML 窗口。它读取两个平面文件并使用这些文件包含的值填充数据网格。 (我没有包含执行此操作的代码,因为它可以正常工作并且与我的问题无关。)我希望用户能够编辑“From”和“To”列中的值,但不能编辑任何其他。当前发生的情况是,当用户单击一个单元格时,整行都会突出显示(变为蓝色),但单击的单元格也会以粗体边框突出显示。如果用户然后单击另一个单元格,则不会发生任何事情(除了突出显示新行和单元格)。如果用户再次单击突出显示的单元格,或按键盘上的某个键,则会收到以下错误:

抛出异常:PresentationFramework.dll 中的“System.InvalidOperationException”

附加信息:此视图不允许使用“EditItem”。

我做错了什么?

这是 XAML 定义:

<Window x:Class="CrewPlanEditor.Validate"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="Check Duties" Height="571" Width="753" MinWidth="674" MinHeight="431" Background="#b3d9ff" Icon="CrewPLAN.ico">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <DataGrid x:Name="DgValidate" Grid.ColumnSpan="3" FontWeight="Normal" ItemsSource="{Binding}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Width="60" Header="Crew" Binding="{Binding DutyNo}" />
                <DataGridTextColumn Width="60" Header="Run" Binding="{Binding BusNo}" />
                <DataGridTextColumn Width="60" Header="From" Binding="{Binding From}" />
                <DataGridTextColumn Width="60" Header="To" Binding="{Binding To}" />
                <DataGridTextColumn Width="60" Header="Brk" Binding="{Binding Next}" />
                <DataGridTextColumn Width="60" Header="Type" Binding="{Binding DutyTypeName}" />
                <DataGridTextColumn Width="60" Header="Depot" Binding="{Binding Depot}" />
                <DataGridTextColumn Width="60" Header="Cost" Binding="{Binding Cost}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

这是它背后的 C#:

using System.Windows;
using CrewPlanEditor.Contexts;
using IO = System.IO;

namespace CrewPlanEditor
{
    /// <summary>
    /// Interaction logic for Validate.xaml
    /// </summary>
    public partial class Validate
    {
        public Validate(string jobFolder)
        {
            var dutiesFile = IO.Path.Combine(jobFolder, "Data", "Duties.txt");
            var dutyTypesFile = IO.Path.Combine(jobFolder, "Data", "DutyTypes.txt");
            var duties = new DutiesFileReader().ReadFile(null, dutiesFile, dutyTypesFile).GridDutyData;
            DataContext = duties;
            InitializeComponent();
        }
    }
}

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

    您需要确保“GridDutyData”集合的类型支持编辑。它应该实现 IList 接口。例如, HashSet 没有,但 List 和 ObservableCollection 可以。

    如果您只希望用户能够编辑“From”和“To”列,您可以将其他列的 IsReadonly 属性设置为 True:

    <DataGridTextColumn Width="60" Header="Crew" Binding="{Binding DutyNo}" IsReadOnly="True" /> />
    

    还要确保“From”和“To”属性具有公共设置器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2021-12-11
      • 2011-01-04
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多