我的DataGridTemplateColumn
包含UserControl
:
<DataGridTemplateColumn Header="Projection"
SortMemberPath="SelectedItem"
ClipboardContentBinding="{Binding ProjectionMethod.Value, Mode=TwoWay}"
>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:DataGridComboBoxCellControl DataContext="{Binding}"
SelectedItem="{Binding ProjectionMethod.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding ProjectionMethodsTextWrapper, Mode=OneWay}"
ErrorMessage="{Binding ProjectionMethod.ErrorMessage, Mode=OneWay}">
</local:DataGridComboBoxCellControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
UserControl
绑定是使用DependencyProperties
在UserControl
定义中设置的ProjectionMethod.Value
完成的。
在大多数情况下,控件工作正常。但是在粘贴时,即使内容在视觉上似乎被粘贴,单元格也不会将粘贴内容提交到ClipboardContentBinding
(即使它被设置为ProjectionMethod.Value
)。调试显示甚至从未调用UserControl
的setter。
更奇怪的是,在粘贴期间调用了ClipboardContentBinding
的构造函数。我不知道为什么会这样。我粘贴到现有单元格,没有创建新行。我假设ProjectionMethod.Value
路由直接到底层属性UserControl
。为什么粘贴命令甚至困扰着UI控件对我来说是一个谜。
似乎这个问题可能需要对WPF有相当深入了解的人。
(以下是TextBlock
的当前xaml。现在它基本上是ComboBox
和ElementName=parentControl
,其中包含一些其他用于显示错误的控件。任何行{{1}绑定到依赖项属性。TextBlock
和ComboBox
都绑定到同一个SelectedItem
DP。
<UserControl x:Class="DataGridComboBoxCellControl"
x:Name="parentControl"
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"
xmlns:local="clr-namespace:MyProject"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<local:MyStringToThicknessConverter x:Key="PopToOne" PopString="1" EmptyString="0"/>
<local:MyStringToVisibilityConverter x:Key="PopToVis" PopString="Visible" EmptyString="Collapsed"/>
</UserControl.Resources>
<Grid ToolTip="{Binding ElementName=parentControl, Path=ErrorMessage, Mode=OneWay}"
IsEnabled="{Binding IsProjectionEnabled}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="3" BorderThickness="{Binding ElementName=parentControl, Path=ErrorMessage, Mode=OneWay, Converter={StaticResource PopToOne}}"
BorderBrush="Red"/>
<Control Grid.Column="0"
Margin="1,0"
Template="{DynamicResource local:MyStyleRef, ResourceKey=errorGrid}"
Visibility="{Binding ElementName=parentControl, Path=ErrorMessage, Mode=OneWay, Converter={StaticResource PopToVis}}"/>
<TextBlock Grid.Column="1" Text="{Binding ElementName=parentControl, Path=SelectedItem, Mode=OneWay}" VerticalAlignment="Center"/>
<ComboBox Grid.Column="2"
Style="{DynamicResource local:MyStyleRef, ResourceKey=noText_ComboBoxStyle}"
ItemsSource="{Binding ElementName=parentControl, Path=ItemsSource, Mode=OneWay}"
SelectedItem="{Binding ElementName=parentControl, Path=SelectedItem}" />
</Grid>
</UserControl>
更新的
我现在尝试完全删除UserControl
并将其xaml代码直接转储到DataTemplate
的{{1}} - 同样的问题或多或少。从视觉上看,粘贴似乎已执行,但永远不会调用TemplateColumn
的setter,因此视图模型永远不会更新。我正在使用ProjectionMethod.Value
命令进行粘贴。
答案 0 :(得分:1)
我想我明白了。我将剪贴板粘贴的更新触发器设置为PropertyChanged
:
ClipboardContentBinding="{Binding ProjectionMethod.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
现在粘贴时会立即提交价值。我不知道默认行为应该是什么,但是在粘贴值从未提交之前,即使在行离开之后也是如此。仍然不确定为什么要调用UserControl
的构造函数。