组件代码
<DataGrid Name="dgMain" Grid.Row="1" Grid.ColumnSpan="3"
Margin="10"
ColumnWidth="100"
SelectionUnit="Cell"
dataGrid2D:ItemsSource.ColumnHeadersSource="{Binding ColumnHeaders}"
dataGrid2D:ItemsSource.RowHeadersSource="{Binding RowHeaders}"
dataGrid2D:ItemsSource.RowsSource="{Binding Data, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="CellEditEnding">
<i:InvokeCommandAction Command="{Binding ParseValue, UpdateSourceTrigger=PropertyChanged}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
命令码
public ICommand ParseValue { get; }
private void Eval()
{
for (int i = 0; i < columnCount; i++)
for (int j = 0; j < rowCount; j++)
if (Data[i][j] != null)
{
Data[i][j] = RM(Data[i][j]);
OnPropertyChanged(nameof(Data));
}
}
private string RM(string dataString)
{
return dataString.Remove(0,1);
}
几个问题一次:
- 数据在变化,但变化没有显示在窗体上
- 每次都跑遍整个 string[][] 数据不是一个很有趣的想法
- 目前尚不清楚如何准确获取已更改的单元格
你在做一些奇怪的事情。让我们尝试更简单且不使用外部模块。
对于初学者,您不需要非常不舒服的 'y'
DataGrid,让我们继续进行正常ItemsControl的 'y'。如果我们想要行和列,让我们进行嵌套。我们得到这个 XAML:
在内部
ItemsControl'e,我不得不重新定义ItemsPanel以使元素水平显示。现在,为什么我们突然有了一个绑定
<TextBox Text="{Binding Value}"/>?它从哪里来Value?问题是,如果我们只是绑定到string[][],您DataContext的内部单元格的第 1 个将只是string,数组将被解析为单独的行。更新字符串时DataContext,将更新 ,但不会更新数组。所以我们需要一个字符串容器。为了不改变数组的结构string[][],让容器引用它。我们得到以下辅助结构:
我们的 VM 将如下所示:
结果:
现在,如果你想添加一些逻辑,你需要把它放在
Value类的属性设置器中StrignHolder,并且不要忘记在其中实现它INotifyPropertyChanged。