WPF RadioButton - 覆盖状态更改

时间:2012-06-06 15:19:15

标签: .net wpf radio-button

在.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方法将进行一些验证,然后提供一个对话框,通知用户将保存新的“Selected Item”。

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

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

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

1 个答案:

答案 0 :(得分:2)

我有一些代码,我清除任何单选按钮,它对我有用。检查您的代码。事件是INotifyPropertyChanged而不是通知财产。

<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;   
    }