在子属性上启用WPF按钮更改

时间:2016-09-21 16:58:09

标签: c# wpf xaml

我有一些像这样看起来(修剪过)的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:

我认为我的问题实际上是:绑定属性是计算属性,但计算使用数组元素的子属性。因此,当该子属性发生变化时,我该如何引发通知,该子属性本身位于定义每个数组元素的不同类中?

1 个答案:

答案 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