Что мне нужно сделать, чтобы ContentControl работал вместе с IDataErrorInfo и проверять действительность, когда флажок установлен или снят?
Добавление бита к Рейчелс ответ.
Эту проблему было бы легче решить с помощью асинхронной проверки данных, но, к сожалению, она не доступна до WPF 4.5 выпущен .
Content
привязывается к GeneralInvoiceTypes
в MainViewModel
.Так как мы не можем выполнить асинхронную проверку данных, то PropertyChanged
необходимо повысить до GeneralInvoiceTypes
, чтобы проверка прошла.Это сработало бы, но я бы использовал подход, предложенный Рэйчел , и ввел бы другое свойство под названием IsValid
в MultipleOptionsViewModel
Привязка к IsValid
может быть выполнена изTag
(или прикрепленное свойство) к GeneralInvoiceTypes.IsValid
.Мы также должны получать уведомления в MultipleOptionsViewModel , когда IsChecked
изменяется в любом из Options
.Это можно сделать, например, с помощью привязки команды в CheckBoxes
.
Поэтому потребуются некоторые изменения в следующих строках.
Я также загрузил пример проекта сэто реализовано здесь: https://www.dropbox.com/s/fn8e4n4s68wj3vk/ContentControlValidationTest.zip?dl=0
ContentControl
<ContentControl Content="{Binding Path=GeneralInvoiceTypes}"
Tag="{Binding Path=GeneralInvoiceTypes.IsValid,
ValidatesOnDataErrors=True}" />
OptionViewModel DataTemplate
<DataTemplate DataType="{x:Type ViewModels:OptionViewModel}">
<CheckBox IsChecked="{Binding IsChecked}"
Content="{Binding Name}"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}},
Path=DataContext.IsValidCheckCommand}"
Margin="6,3,3,0" />
</DataTemplate>
MultipleOptionsViewModel
private ICommand m_isValidCheckCommand;
public ICommand IsValidCheckCommand
{
get
{
return m_isValidCheckCommand ??
(m_isValidCheckCommand = new RelayCommand(param => IsValidCheck()));
}
}
private void IsValidCheck()
{
IsValid = CheckIsValid();
}
private bool CheckIsValid()
{
foreach (OptionViewModel option in Options)
{
if (option.IsChecked == true)
{
return true;
}
}
return false;
}
private bool m_isValid;
public bool IsValid
{
get { return m_isValid; }
set
{
m_isValid = value;
OnPropertyChanged("IsValid");
}
}
public string this[string columnName]
{
get
{
if (columnName == "IsValid")
{
if (IsValid == false)
{
return "At least 1 Option must be selected";
}
}
return string.Empty;
}
}