Вот моя модель:
public class ValidatedExaminationAnswerModel : ExaminationAnswerModel, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public bool IsCorrect { get; set; } = false;
}
public class ObservableExaminationSettingModel
{
public string MaxReactionTime { get; set; }
public bool IsMaxReactionTimeCorrect { get; set; } = false;
public ObservableCollection<ValidatedExaminationAnswerModel> CorrectAnswers { get; set; } = new ObservableCollection<ValidatedExaminationAnswerModel>();
}
public Dictionary<string, ObservableExaminationSettingModel> CasesAnswers { get; set; }
Вот мой Xaml:
<ListView.View>
<GridView>
<GridViewColumn
Header = "{x:Static localization:Resources.TestCaseNameLable}"
DisplayMemberBinding = "{Binding Key}" />
<GridViewColumn Header = "Reaction Time">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Grid.Column = "1" >
<TextBox.Text>
<Binding Path = "Value.MaxReactionTime"
UpdateSourceTrigger = "PropertyChanged"/>
</TextBox.Text>
<TextBox.Style>
<Style TargetType = "TextBox">
<Style.Triggers>
<DataTrigger Binding = "{Binding Path=IsMaxReactionTimeCorrect, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value = "True">
<Setter Property = "Background" Value = "White"/>
</DataTrigger>
<DataTrigger Binding = "{Binding Path=IsMaxReactionTimeCorrect, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value = "False">
<Setter Property = "Background" Value = "IndianRed"/>
</DataTrigger>
</Style.Triggers>
<Setter Property = "cal:Message.Attach" Value = "[Event KeyUp] = [Action IsReactionTimeCorrect($dataContext)]"/>
</Style>
</TextBox.Style>
</TextBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
Я хочу привязать свойство IsMaxReactionTimeCorrect к стилю, чтобы показывать, когда значение неверно, но ничего не происходит, похоже, что xaml просто не видит эту переменную. И я не могу понять почему. (Когда IsMaxReactionTimeCorrect меняет свое значение в соответствии с моими правилами)





Вы должны реализовать PropertyChanged для вашего IsMaxReactionTimeCorrect. В противном случае View не знает, изменило ли ваше свойство свое значение.
public class ObservableExaminationSettingModel : INotifyPropertyChanged
{
public string MaxReactionTime { get; set; }
private bool _isMaxReactionTimeCorrect ;
public bool IsMaxReactionTimeCorrect
{
get
{
return _selected;
}
set
{
_selected = value;
RaisePropertyChanged("IsMaxReactionTimeCorrect");
}
}
public ObservableCollection<ValidatedExaminationAnswerModel> CorrectAnswers { get; set; } = new ObservableCollection<ValidatedExaminationAnswerModel>();
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Если вы используете Fody для внедрения события PropertyChanged, ваша модель должна реализовывать INotifyPropertyChanged.
public class ObservableExaminationSettingModel : INotifyPropertyChanged
{
}
Поскольку вы используете Fody,
ObservableExaminationSettingModelдолжен быть производным отINotifyPropertyChanged. (Из документации Fody: «Все классы, реализующие INotifyPropertyChanged, будут иметь код уведомления, введенный в установщики свойств».)