Как проверить, является ли UserControl действительным или нет - PullRequest
1 голос
/ 02 марта 2011

У меня есть текстовое поле внутри usercontrol, которое реализует ValidationRule, и оно работает нормально, теперь в окне, где я использую этот элемент управления, есть одна кнопка, и я хочу, чтобы эта кнопка была отключена, если текстовое поле внутри usercontrol недействительно

1 Ответ

0 голосов
/ 02 марта 2011

Хитрость в том, чтобы использовать команду вместо события щелчка.Команда содержит логику, чтобы определить, является ли команда действительной, а также фактический код, запускаемый при выполнении команды.

Мы создаем команду и привязываем к ней кнопку.Кнопка автоматически отключится, если Command.CanExecute () вернет false.Использование командной оболочки имеет множество преимуществ, но я не буду вдаваться в них здесь.

Ниже приведен пример, с которого следует начать.XAML:

<StackPanel>
    <Button Content="OK" Command="{Binding Path=Cmd}">
    </Button>
    <TextBox Name="textBox1">
        <TextBox.Text>
            <Binding Path="MyVal" UpdateSourceTrigger="PropertyChanged" >
                <Binding.ValidationRules>
                    <local:MyValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</StackPanel>

Кодовая часть UserControl (это, вероятно, похоже на то, что у вас уже есть, но я включил его, чтобы показать, как создается команда):

public partial class UserControl1 : UserControl
{
    private MyButtonCommand _cmd;
    public MyButtonCommand Cmd
    {
        get { return _cmd; }
    }

    private string _myVal;
    public string MyVal
    {
        get { return _myVal; }
        set { _myVal = value; }
    }

    public UserControl1()
    {
        InitializeComponent();
        _cmd = new MyButtonCommand(this);
        this.DataContext = this;
    }
}

Командный класс.Цель этого класса - определить, является ли команда действительной с помощью системы проверки, и обновить ее состояние при изменении TextBox.Text:

public class MyButtonCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        if (Validation.GetHasError(myUserControl.textBox1))
            return false;
        else
            return true;
    }

    public event EventHandler CanExecuteChanged;
    private UserControl1 myUserControl;

    public MyButtonCommand(UserControl1 myUserControl)
    {
        this.myUserControl = myUserControl;
        myUserControl.textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
    }

    void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, EventArgs.Empty);
    }

    public void Execute(object parameter)
    {
        MessageBox.Show("hello");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...