WPF запретить доступ к кнопке если один из textbox пустой

436
27 октября 2017, 10:41

У меня на окне 36 textBox, как адекватно сделать запрет к кнопке если хоть одно поле пустое? Каждый textBox подписываеться на параметры свойства:

    private Mark selectedMark;
    public Mark SelectedMark
    {
        get { return selectedMark; }
        set
        {
            selectedMark = value;
            OnPropertyChanged("SelectedMark");
        }
    }

Подписываюсь к параметрам так

<TextBox Text="{Binding SelectedMark.OC1}" />
Answer 1

Я бы предложил Вам завести bool переменную, равную && всех значений в textBox. Т.е. проверять каждый textBox и через && добавлять значение выражения (text == "") к этой переменной.

А доступ соответственно подвесить на true этой переменной.

Answer 2

Пример с использованием атрибутов и рефлексии.

Есть базовый класс для VM:

abstract class Vm : INotifyPropertyChanged
{
    protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(field, value))
            return false;
        field = value;
        NotifyPropertyChanged(propertyName);
        return true;
    }
    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

наследуем от него класс поддерживающий валидацию:

abstract class ValidatableVm : Vm
{
    protected override bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        var b = base.Set(ref field, value, propertyName);
        if (b && GetType().GetProperty(propertyName).GetCustomAttributes(typeof(RequiredAttribute), true).Length > 0)
        {
            IsValid = GetType().GetProperties()
                               .Where(p => p.GetCustomAttributes(typeof(RequiredAttribute), true).Length > 0)
                               .Select(p => (string)p.GetValue(this))
                               .All(s => !string.IsNullOrEmpty(s));
            NotifyPropertyChanged(nameof(IsValid));
        }
        return b;
    }
    public bool IsValid { get; private set; }
}

Здесь в методе Set если произошло обновление свойства, то для текущего типа VM берем все свойства помеченные атрибутом и проверяем чтобы они были не пусты.
Я использовал атрибут Required из пространства имен System.ComponentModel.DataAnnotations, если вам это не подходит - вы можете создать свой атрибут.

Пример использования, VM:

class MainVM : ValidatableVm
{
    string name;
    [Required]
    public string Name
    {
        get => name;
        set => Set(ref name, value);
    }
    string address;
    [Required]
    public string Address
    {
        get => address;
        set => Set(ref address, value);
    }
    string phone;
    public string Phone
    {
        get => phone;
        set => Set(ref phone, value);
    }
}

Обратите внимание, атрибутом помечены только 2 свойства, именно они и будут проверяться на непустоту.

Разметка:

<StackPanel Margin="5">
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Text="{Binding Address, UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Text="{Binding Phone, UpdateSourceTrigger=PropertyChanged}"/>
    <Button Content="Click me" IsEnabled="{Binding IsValid}"/>
</StackPanel>

READ ALSO
Вызов неуправляемого кода из управляемого

Вызов неуправляемого кода из управляемого

Есть необходимость вызвать функцию WinAPI из кода на C#Какие средства языка позволяют это сделать?

211
Подкючение внешней компоненты V77S.Application c#

Подкючение внешней компоненты V77S.Application c#

ПриветКто сталкивался с такой задачей как подключение внеш компоненты 1с 7

228
C# вопрос по потокам для изучения

C# вопрос по потокам для изучения

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

238
(deflate + base64 в C#)

(deflate + base64 в C#)

ЗдравствуйтеПредстоит задача зашифровать и расшифровать текст, который скорее всего закодирован в Deflate + base64

259