2017-01-09 3 views
0

Я пытаюсь сделать это несколько, и мне еще очень не нравится пример этого.WPF Validating TextBox во внешней библиотеке

Я пытаюсь проверить запись в текстовом поле, которая по существу является обязательным полем (она не может быть пустой или пустой). Однако у меня нет никакого доступа к коду позади, только для 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 песочнице и на который ссылается только через 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"/> 

Моя проблема с тем, что у меня есть сейчас, заключается в том, что она показывает текстовое поле в моем окне конструктора в моем приложении sandbox, но я не могу щелкнуть по нему, когда я запустил. Это почти так, как будто этого не существует.

Спасибо за понимание!

ответ