WPF验证外部库中的TextBox

时间:2017-01-09 14:21:49

标签: c# wpf xaml

我想要做的就是在那里,我还没有真正看到这样的例子。

我正在尝试验证一个基本上是必填字段的文本框条目(它不能为null或为空)。但是,我没有任何访问代码的权限,只有XAML和表单的数据绑定。

从搜索几天开始,我发现这不能在XAML中严格完成(本来是首选),并且必须创建自己的资源库来检查这一点。这就是我所做的,但未能让它发挥作用。

这甚至可能吗?或者我需要做些什么才能让它发挥作用?

到目前为止我所做的是创建一个文本框的usercontrol模板,然后在XAML中使用(驻留在外部库中):

<UserControl.Resources>
    <Style x:Key="TextBoxStyle" TargetType="TextBox">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel LastChildFill="True">
                        <Border BorderBrush="Red" BorderThickness="1">
                            <AdornedElementPlaceholder Name="MyAdorner"/>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid>
    <DockPanel x:Name="dpMain" LastChildFill="True">
        <Label/>
    </DockPanel>
</Grid>

背后的代码:

namespace ClassLibrary.CustomControls
{

public partial class CssTextBox : UserControl
{
    private TextBox _textbox = null;
    private ObservableCollection<ValidationRule> _validationRules = null;

    public CssTextBox()
    {
        InitializeComponent();
        CreateControls();
        ValidationRules = new ObservableCollection<ValidationRule>();
        this.DataContextChanged += new DependencyPropertyChangedEventHandler(CssTextBoxDataChanged);
    }

    public ObservableCollection<ValidationRule> ValidationRules
    {
        get { return _validationRules; }
        set { _validationRules = value; }
    }

    private void CreateControls()
    {
        _textbox = new TextBox() { Width = 100, Height = 20 };
        _textbox.LostFocus += CssTextBoxLostFocus;
        _textbox.Style = TextBoxErrorStyle;
    }

    public void CssTextBoxDataChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if (_textbox != null)
        {
            var binding = new Binding();
            binding.Source = this.DataContext;
            binding.ValidatesOnDataErrors = true;
            binding.ValidatesOnExceptions = true;

            foreach (var rule in ValidationRules)
            {
                binding.ValidationRules.Add(rule);
            }

            binding.Path = new PropertyPath(BoundPropertyName);
            _textbox.SetBinding(TextBox.TextProperty, binding);

            dpMain.Children.Add(_textbox);
        }
    }

    public void CssTextBoxLostFocus(object sender, RoutedEventArgs e)
    {
        var bindingExpression = _textbox.GetBindingExpression(TextBox.TextProperty);
        if (bindingExpression != null)
            bindingExpression.UpdateSource();
    }

    private Style TextBoxErrorStyle
    {
        get
        {
            return (Style)FindResource("TextBoxStyle");
        }
    }

    public string TextBoxErrorStyleName { get; set; }
    public string BoundPropertyName { get; set; }
    public string ValidationExpression { get; set; }
    public string Text
    {
        get
        {
            return _textbox.Text;
        }

    }

    public string ErrorText { get; set; }
}

以及如何使用它(目前正在WPF Sandbox项目中测试并且仅通过XAML引用):

xmlns:css="clr-namespace:WpfSandbox.CustomControls" <!--Reference to library that holds above--!>


    <css:CssTextBox TextBoxErrorStyleName="TextBoxStyle" Grid.Column="0" Grid.Row="1" Width="100" Height="20" VerticalAlignment="Top" >
        <css:CssTextBox.ValidationRules>
            <validators:NotNullOrEmptyValidationRule ErrorMessage="Cannot be Empty!" />
        </css:CssTextBox.ValidationRules>
    </css:CssTextBox>
    <TextBox Grid.Column="0" Grid.Row="2" Width="auto" Height="20" VerticalAlignment="Top" Background="White" IsEnabled="True"/>

我现在的问题是,它在我的沙盒应用程序的设计器窗口中显示了文本框,但是当我运行时我无法点击它。它几乎就像它不存在一样。

感谢您的任何见解!

1 个答案:

答案 0 :(得分:-1)

您应该阅读有关WPF数据验证的信息。 此链接将帮助您: https://msdn.microsoft.com/fr-fr/library/system.componentmodel.idataerrorinfo(v=vs.95).aspx