У меня на окне 36 textBox, как адекватно сделать запрет к кнопке если хоть одно поле пустое? Каждый textBox подписываеться на параметры свойства:
private Mark selectedMark;
public Mark SelectedMark
{
get { return selectedMark; }
set
{
selectedMark = value;
OnPropertyChanged("SelectedMark");
}
}
Подписываюсь к параметрам так
<TextBox Text="{Binding SelectedMark.OC1}" />
Я бы предложил Вам завести bool переменную, равную && всех значений в textBox. Т.е. проверять каждый textBox и через && добавлять значение выражения (text == "") к этой переменной.
А доступ соответственно подвесить на true этой переменной.
Пример с использованием атрибутов и рефлексии.
Есть базовый класс для 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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть необходимость вызвать функцию WinAPI из кода на C#Какие средства языка позволяют это сделать?
ПриветКто сталкивался с такой задачей как подключение внеш компоненты 1с 7
Уважаемы гуру, есть вопросХочу изучить потоки и не пойму с чего начать, а может что то и вообще не нужно для изучения или устарело
ЗдравствуйтеПредстоит задача зашифровать и расшифровать текст, который скорее всего закодирован в Deflate + base64