2012-06-06 3 views
1

.NET Framework v4.0에서는 WPF RadioButton의 상태 변경을 재정의 할 수 있습니까?WPF RadioButton - 재정의 상태 변경

아래의 XAML에서는 ListBox를 사용하여 하나의 항목이 "Selected Item"으로 간주되는 동적 항목 수를 표시합니다. RadioButton에를 클릭하면

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

는 OnItemSelected 방법은 몇 가지 유효성 검사를 수행 한 다음 새 "선택한 항목"저장 될 사용자를 알리는 대화 상자를 제공합니다.

오류가 발생하거나 저장을 취소하는 사용자의 경우 RadioButton 상태 변경을 재설정/재정의해야합니다. 즉, IsSelected 속성의 값을 수동으로 변경합니다.

다음 디버깅을 통해 다음 이벤트 시퀀스를 볼 수 있습니다.

  1. 라디오 버튼 IsSelected 특성 값 변경의 원인 판정하고 NotifyPropertyEventIsSelected 속성의 신규 값을 판독
  2. 소성한다.
  3. OnSelected 메서드가 호출되어 대화 상자가 나타납니다.
  4. 사용자가 작업을 취소하고 각 바인딩 된 개체에 수동으로 IsSelected을 호출하여 값을 다시 설정합니다. 이것은 복수의 NotifyPropertyEvents을 발사합니다.
  5. 재설정 값은 절대로 다시 읽지 않습니다.
+0

라디오 버튼 인 경우 하나만 선택할 수 있으므로 여러 번 재설정되는 이유는 무엇입니까? 이벤트를 시도하지 않고 설정의 대화 상자를 호출하십시오. 그들이 취소하면 단순히 값을 설정하지 마십시오. – Paparazzi

답변

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

안녕하세요, 코드 샘플을 보내 주셔서 감사합니다. 네, NotifyPropertyChanged 이벤트를 발생시킵니다. 흥미롭게도, 위의 예처럼 RadioButton의 상태를 클릭했을 때보 다 버튼을 구현 한 것입니다! Bindings는 작동하지만 RadioButton의 Checked 이벤트를 통해 설정된 경우가 아닙니까? – Alex

+0

그런 다음 내 의견에서 제안을 이벤트와 바인딩을 섞지 마십시오. 모든 것을 세트에서하십시오. – Paparazzi

+0

이벤트가 바인딩 된 상태에서 혼합되어 작동했습니다. 대화 상자가 문제 일 수 있습니다. – Paparazzi