如何允许用户更改XAML数据网格中的值?

时间:2016-12-23 12:43:51

标签: c# wpf xaml datagrid

我有一个包含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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要确保“GridDutyData”集合的类型支持编辑。它应该实现IList接口。的HashSet&LT; T&GT;例如,但不是List&lt; T&gt;和ObservableCollection做。

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

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

还要确保“发件人”和“收件人”属性具有公共设置器。