1

在 .NET Framework v4.0 中,是否可以覆盖 WPF 的状态更改RadioButton

在下面的 XAML 中,我使用列表框来显示动态数量的项目,其中单个项目被视为“选定项目”。

<ListBox Height="Auto"
         Name="listBoxItems"
         ItemsSource="{Binding Mode=OneWay, Path=Items}"
         SelectedItem="{Binding Path=UserSelectedItem}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <RadioButton GroupName="SameGroup" Checked="OnItemSelected" IsChecked="{Binding Mode=TwoWay, Path=IsSelected}" CommandParameter="{Binding}"/>
        <TextBlock Text="{Binding Mode=OneTime, Converter={StaticResource itemDescriptionConverter}}"/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

单击 RadioButton 时,OnItemSelected 方法将进行一些验证,然后提供一个对话框,通知用户将保存新的“选定项”。

如果出现错误情况,或者用户取消保存,我希望重置/覆盖 RadioButton 状态更改。即我手动更改 IsSelected 属性的值。

通过调试,我看到了以下事件序列。

  1. 选中单选按钮导致IsSelected属性更改值,并NotifyPropertyEvent触发a
  2. IsSelected读取属性的新值。
  3. OnSelected方法被调用,产生一个对话框。
  4. 用户取消操作,我手动调用IsSelected每个绑定对象,将值重置回来。这会触发多个NotifyPropertyEvents.
  5. 永远不会重新读取重置值。
4

1 回答 1

2

我有一些代码可以清除任何 RadioButtons,它对我有用。检查您的代码。该事件是 NotifyPropertyChanged 而不是 NotifyProperty。

<ListBox ItemsSource="{Binding Path=cbs}" SelectionMode="Single">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <RadioButton GroupName="UserType" Content="{Binding Path=name}" IsChecked="{Binding Path=chcked, Mode=TwoWay}" Checked="RadioButton_Checked" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>


    public class cb: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        private bool c = false;
        public bool chcked 
        {
            get { return c; }
            set 
            {
                if (c == value) return;
                c = value;
                NotifyPropertyChanged("chcked");
            } 
        }
        public string name { get; private set; }
        public cb(string _name) { name = _name; }
    }

    private void btnClickClearAll(object sender, RoutedEventArgs e)
    {
        foreach (cb c in cbs.Where(x => x.chcked))
        {
            c.chcked = false;
        }
    }

    private void RadioButton_Checked(object sender, RoutedEventArgs e)
    {
        if (cbs[0].chcked) cbs[0].chcked = false;   
    }
于 2012-06-06T16:05:58.317 回答