1

.NET Framework v4.0 では、WPF の状態変更をオーバーライドできますRadioButtonか?

以下の XAML では、Listbox を使用して動的な数のアイテムを表示しています。そのうちの 1 つのアイテムが「選択されたアイテム」と見なされます。

<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し、
  2. プロパティの新しい値IsSelectedが読み取られます。
  3. OnSelectedメソッドが呼び出され、ダイアログ ボックスが表示されます。
  4. ユーザーがアクションをキャンセルすると、IsSelectedバインドされた各オブジェクトを手動で呼び出し、値をリセットします。これにより、複数のNotifyPropertyEvents.
  5. リセット値は決して再読み込みされません。
4

1 に答える 1

2

RadioButtons をクリアするコードがいくつかあり、それは私のために働いています。コードを確認します。イベントは、NotifyProperty ではなく NotifyPropertyChanged です。

<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 に答える