【问题标题】:Different templates for INotifyDataErrorInfoINotifyDataErrorInfo 的不同模板
【发布时间】:2016-11-29 18:06:38
【问题描述】:

我有错误对象:

/// <summary>
/// Represent error in wizard control child.
/// </summary>
public sealed class ErrorContainer
{
    /// <summary>
    /// Ctor.
    /// </summary>
    /// <param name="kind"></param>
    /// <param name="message"></param>
    public ErrorContainer(ErrorKind kind, string message)
    {
        Contract.Requires(!string.IsNullOrEmpty(message));

        Kind = kind;
        Message = message;
    }

    /// <summary>
    /// Kind of error.
    /// </summary>
    public ErrorKind Kind { get; private set; }

    /// <summary>
    /// Text to display.
    /// </summary>
    public string Message { get; private set; }

    public override string ToString()
    {
        return Message;
    }
}

/// <summary>
/// Kind of error.
/// </summary>
public enum ErrorKind
{
    /// <summary>
    /// Prevents telegram send.
    /// </summary>
    Critical = 0,

    /// <summary>
    /// Only display message.
    /// </summary>
    Warning = 1
}

我为我的文本框使用 INotifyDataErrorInfo 和自定义样式。我将 ErrorContainer 的集合作为 INotifyDataErrorInfo 错误返回。我只想在ErrorKindCritical 时显示错误消息。这是我尝试的方法:

<Style x:Key="TextboxWithAdvancedValidationHorizontal" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
  <Style.Triggers>
    <DataTrigger Binding="{Binding CurrentItem.ErrorContent.Kind}" Value="{x:Static kn01:ErrorKind.Critical}">
      <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
          <ControlTemplate>
            <StackPanel Orientation="Horizontal" SnapsToDevicePixels="True">
              <Border BorderBrush="Salmon" Background="#11FF0000" IsHitTestVisible="False">
                <AdornedElementPlaceholder />
              </Border>
              <StackPanel Orientation="Horizontal">
                <Polygon  VerticalAlignment="Center" Points="0,4 4,0 4,8" Fill="Salmon" Stretch="Fill" Stroke="Salmon" StrokeThickness="2" />
                <Border Background="Salmon" Padding="4" Margin="-1,0,0,0">
                  <TextBlock HorizontalAlignment="Center" Foreground="White" FontWeight="Bold" Margin="2,-1,0,1" Text="{Binding CurrentItem.ErrorContent}" />
                </Border>
              </StackPanel>
            </StackPanel>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </DataTrigger>
  </Style.Triggers>
</Style>

但是它根本不起作用并使用默认错误模板。

【问题讨论】:

    标签: c# wpf xaml datatrigger


    【解决方案1】:

    你试过用断点调试它来检查你的绑定吗? 另外,我认为您以错误的方式定位自己的风格。这是另一个可能有帮助的答案:https://stackoverflow.com/a/4133971/6563936

    【讨论】:

    • 我确定我以错误的方式定位我的风格,但我不明白它应该如何定位它。
    • 您确实将 Style="{StaticResource TextboxWithAdvancedValidationHorizo​​ntal}" 添加到要显示错误的 TextBox 中,对吧?
    • 我确实做到了。问题不在于我如何绑定控件样式,而在于我如何在内部触发器中绑定 INotifyDataErrorInfo 错误。
    • 这就是为什么我问你是否尝试用断点调试它。在吸气剂上设置一个,看看它是否触发。如果你使用 Visual Studio,你可以在 Event log 中看到是否有一些 Binding 错误!
    • 另外,也许试试 (Validation.Errors).CurrentItem.ErrorContent.Kind!
    【解决方案2】:

    不要将Validation.ErrorTemplate 模板放在触发器中。

    Validation.ErrorTemplate必须在错误发生之前设置。

    如果您需要不同的错误模板,请在 ErrorTemplate 中使用触发器。或者,您可以将ContentPresenterContentTemplateSelector 一起使用。

    <Style x:Key="TextboxWithAdvancedValidationHorizontal" TargetType="TextBox">
      <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
    
              <ControlTemplate>
                <StackPanel Orientation="Horizontal" SnapsToDevicePixels="True">
                  <Border BorderBrush="Salmon" Background="#11FF0000" IsHitTestVisible="False">
                    <AdornedElementPlaceholder />
                  </Border>
                </StackPanel>
    
                <ControlTemplate.Triggers>
                  <DataTrigger Binding="...">
                    <!-- add you custom UI logic here -->
                  </DataTrigger>
                </ControlTemplate.Triggers>
              </ControlTemplate>
    
        </Setter.Value>
      </Setter>
    </Style>
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2022-01-19
      • 2020-12-15
      • 1970-01-01
      相关资源
      最近更新 更多