在wpf中验证ItemsControl并不起作用

时间:2016-10-12 12:31:36

标签: c# wpf xaml validationrules

我有一个ItemsControl来显示翻译文本字段。 我想设置验证,所以如果所有翻译都是空的,则会出现错误,并且字段标记为"错误"。 有没有可能做到这一点?

我的xaml:

<ItemsControl x:Name="LanguageItemsControl" ItemsSource="{Binding Path=Translations, Mode=TwoWay}"
             LostFocus="OnLostFocus" >
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Grid Margin="5,2,5,2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="47*"/>
                <ColumnDefinition Width="53*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" x:Name="ItemLabel" VerticalAlignment="Center" 
            Text="{Binding Path=Key, StringFormat={x:Static res:Resources.lblCaption}}" />
            <TextBox Grid.Column="1" x:Name="ItemText" VerticalAlignment="Center" 
                 HorizontalAlignment="Stretch" Margin="2,0,22,0"
            Text="{Binding Path=Value, Mode=TwoWay, 
            UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"
                LostFocus="OnLostFocus"
                 AcceptsReturn="True"
                 MaxLines="2"
                 ScrollViewer.VerticalScrollBarVisibility="Auto"
                     MaxLength="150">
            </TextBox>
        </Grid>
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

我的模型的类实现来自IDataErrorInfoINotifyPropertyChanged 翻译是ObservableCollection自定义类型&#34; LanguageValue&#34;公共财产的关键和价值。

我在我的模型string this[string columnName]中,它与简单的文本框(ItemsControl外)完美配合,但是如何才能使这与我的项目一起使用?我有类似的东西:

public string this[string columnName]
{
 get
 {
    string result = null;
    ...
    if (columnName == "Translations" || columnName == "ItemText")
    {
       if (Translations.All(t => string.IsNullOrEmpty(t.Value)))
          result = Properties.Resources.errMsgEnterName;
    }
...

但当然这没有用。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

当然,我给你一个完整的实施,但只有&#34;价值&#34;属性。对要验证的所有其他属性执行相同操作:

1.具有IDataErrorInfo接口实现的翻译模型:

public class Translation : BindableBase, IDataErrorInfo
{
    public string Value { get; set; }

    public string this[string propertyName]
    {
        get
        {
            return GetErrorForPropery(propertyName);
        }
    }

    public string Error { get; }

    private string GetErrorForPropery(string propertyName)
    {
        switch (propertyName)
        {
            case "Value":

                if (string.IsNullOrEmpty(Value))
                {
                    return "Please enter value";
                }

                return string.Empty;

            default:
                return string.Empty;
        }
    }
}

2.在ViewModel中初始化翻译:

  public ObservableCollection<Translation> Translations { get; set; }

    public MainViewModel()
    {
        Translations = new ObservableCollection<Translation>
        {
            new Translation {Value = "A"},
            new Translation (),
            new Translation {Value = "C"}
        };
    }

3.Xaml与Value TextBox上的ValidatesOnDataErrors:

  <ItemsControl x:Name="LanguageItemsControl" ItemsSource="{Binding Path=Translations, Mode=TwoWay}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Margin="5,2,5,2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="47*"/>
                        <ColumnDefinition Width="53*"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Grid.Column="0" x:Name="ItemLabel" VerticalAlignment="Center" Text="{Binding Path=Value, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

4.那将在空文本框周围显示一个红色框,如果要在将鼠标悬停在TextBox上时显示错误信息,则需要一个工具提示:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:customControlLib="clr-namespace:CustomControlLib;assembly=CustomControlLib"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    Title="MainWindow" 
    DataContext="{StaticResource MainViewModel}">
<Window.Resources>
    <Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
        <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>
</Window.Resources>
<Grid>
    <ItemsControl x:Name="LanguageItemsControl" ItemsSource="{Binding Path=Translations, Mode=TwoWay}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Margin="5,2,5,2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="47*"/>
                        <ColumnDefinition Width="53*"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Grid.Column="0" x:Name="ItemLabel" Style="{StaticResource TextBoxStyle}" VerticalAlignment="Center" Text="{Binding Path=Value, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>