粘贴到DataGridTemplateColumn时出现奇怪的错误

时间:2014-04-17 22:24:12

标签: wpf visual-studio-2010 datagrid user-controls copy-paste

我的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绑定是使用DependencyPropertiesUserControl定义中设置的ProjectionMethod.Value完成的。

在大多数情况下,控件工作正常。但是在粘贴时,即使内容在视觉上似乎被粘贴,单元格也不会将粘贴内容提交到ClipboardContentBinding(即使它被设置为ProjectionMethod.Value)。调试显示甚至从未调用UserControl的setter。

更奇怪的是,在粘贴期间调用了ClipboardContentBinding 的构造函数。我不知道为什么会这样。我粘贴到现有单元格,没有创建新行。我假设ProjectionMethod.Value路由直接到底层属性UserControl。为什么粘贴命令甚至困扰着UI控件对我来说是一个谜。

似乎这个问题可能需要对WPF有相当深入了解的人。

(以下是TextBlock的当前xaml。现在它基本上是ComboBoxElementName=parentControl,其中包含一些其他用于显示错误的控件。任何行{{1}绑定到依赖项属性。TextBlockComboBox都绑定到同一个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命令进行粘贴。

1 个答案:

答案 0 :(得分:1)

我想我明白了。我将剪贴板粘贴的更新触发器设置为PropertyChanged

ClipboardContentBinding="{Binding ProjectionMethod.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

现在粘贴时会立即提交价值。我不知道默认行为应该是什么,但是在粘贴值从未提交之前,即使在行离开之后也是如此。仍然不确定为什么要调用UserControl的构造函数。