Ошибка проверки WPG DataGrid не обнаружена - PullRequest
1 голос
/ 16 декабря 2009

Я пытаюсь использовать проверку исключений для ячейки в DataGrid вместе со стилем в EditingElementStyle объекта DataGridTextColumn для установки всплывающей подсказки с содержанием ошибки. Ошибка возникает, но не перехватывается и не отображается в WPF.

Код и исключение показаны ниже. Может кто-нибудь сказать мне, что мне нужно это исправить?

Приветствия
Berryl

Вот исключение:

System.Windows.Data Error: 8 : Cannot save value from target back to source. 
BindingExpression:Path=Allocations[6].Amount; DataItem='ActivityViewModel' (HashCode=-938045583); 
target element is 'TextBox' (Name=''); 
target property is 'Text' (type 'String') 
TargetInvocationException:'System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation. ---> 
Domain.Core.PreconditionException: An allocation must be less than one day.

Вот xaml для DataGridTextColumn:

<dg:DataGridTextColumn 
    ....                
    EditingElementStyle="{StaticResource cellEditStyle}"
    Binding="{Binding Allocations[6].Amount, Converter={StaticResource amtConv}, 
        ValidatesOnExceptions=True}"
                               />

А вот стиль, который должен обеспечивать всплывающую подсказку об ошибке:

    <Style x:Key="cellEditStyle" TargetType="{x:Type TextBox}">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Padding" Value="0"/>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter 
                Property="ToolTip" 
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

1 Ответ

5 голосов
/ 25 августа 2010

Вероятно, немного поздно, но, поскольку у меня возникают проблемы такого же рода, вот обходной путь для дальнейшего ознакомления (протестировано с .NET 4.0.30319).

1) Поймать исключение

Хотя следующий код привязки в исходном сообщении прекрасно работает с TextBox, например, он не работает с текстовой ячейкой DataGrid (хотя в документации Msn об этом говорится):

<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, ValidatesOnExceptions=True}"
                    ...
                    />

Вы должны добавить этот бит:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    ...
                    />

Обратите внимание, что, как ни странно (для меня в любом случае), исключение будет перехвачено и показано с восклицательным знаком в заголовке строки. У вас просто не будет красной границы или возможности применить стиль без части Mode=TwoWay.

2) Применение стиля

Другая сложность заключается в установке стиля в случае ошибки, поскольку элемент редактирования закроется, как только вы начнете процесс проверки. Так что прикрепление стиля с помощью:

<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    EditingElementStyle="{StaticResource datagridTBStyle}"
                    ...
                    />

просто не будет работать, если вы захотите вызвать ошибку проверки. Аналогично с CellStyle, у которого не будет флага ошибки для запуска. Вы должны использовать трюк и объявить стиль FrameworkElement, например так:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    ElementStyle="{StaticResource datagridElemStyle}"
                    ...
                    />

Хорошей новостью является то, что вы можете определить стиль для производного элемента, такого как TextBlock, и воспользоваться его свойствами:

<Style x:Key="datagridElemStyle" TargetType="{x:Type TextBlock}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">
      <Setter Property="Background" Value="Yellow" />
      <Setter Property="ToolTip" 
              Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...