【发布时间】: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();
}
}
}
【问题讨论】: