我有一些像这样看起来(修剪过)的XAML,带有一个将IsEnabled
属性绑定到子属性的按钮:
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}">
...
<Button x:Name="continueButton" Content="Continue" IsEnabled="{Binding CurrentQuestion.AnswerSelected, Mode=OneWay}" Click="continueButton_Click"/>
...
CurrentQuestion
是一个从集合中提取当前属性的属性:
public Question CurrentQuestion {
get
{
return Questions[QuestionNo];
}
set
{
Questions[QuestionNo] = value;
}
}
AnswerSelected
检查是否有任何Answer
被标记为已选中。
public bool AnswerSelected
{
get
{
return Answers.Any(a => a.Selected);
}
}
Selected
属性本身由绑定到可能答案的单选按钮设置。因此,用户应该能够在选择答案后继续。
监视Answers
集合的变化,并从OnPropertyChanged()
调用INotifyPropertyChanged
bool属性的AnswerSelected
方法,如下所示:
public Answer[] Answers
{
get
{
return _answers;
}
set
{
_answers = value;
OnPropertyChanged("Answers");
OnPropertyChanged("AnswerSelected");
}
}
绑定成功将按钮设置为禁用,但没有更改单选按钮,然后重新启用按钮。我尝试将AnswerSelected
移动到与CurrentQuestion
相同级别的属性,但这也无效。
要让此按钮重新启用,我错过了什么?另外,有没有更好的方法来完成同样的事情?
修改
这是单选按钮设置的代码。
<Grid DataContext="{Binding CurrentQuestion, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ItemsControl ItemsSource="{Binding Answers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<RadioButton GroupName="AnswerGroup" IsChecked="{Binding Selected}">
<TextBlock Text="{Binding Text}" />
</RadioButton>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
所以它看起来像这样:
CurrentAnswer (Questions[QuestionNo])
AnswerSelected (Answers.Any(a => a.Selected))
编辑2:
我认为我的问题实际上是:绑定属性是计算属性,但计算使用数组元素的子属性。因此,当该子属性发生变化时,我该如何引发通知,该子属性本身位于定义每个数组元素的不同类中?
答案 0 :(得分:0)
我最终需要以受this question影响的方式做的事情是订阅PropertyChanged
类中每个Answer
的{{1}}事件。
Question
当它被解雇时,我更新了void SubscribeToSelect(Answer item)
{
item.PropertyChanged += (s, e) => this.AnswerSelected = e.PropertyName == "Selected" && item.Selected ? true : this.AnswerSelected;
}
属性并对其进行了更新,这又更新了对按钮的绑定:
Question.AnswerSelected