2012-05-09 164 views
2

我有以下情況的對象的具體名單枚舉:綁定單選按鈕,在

  • 我有對象(List<MyObjects>)的列表。
  • 的Class MyObjects包含一個名爲States枚舉和其他一些屬性,如ObjectName

    public enum States { State1, State2, State3, State4, State5 } 
    public string ObjectName { get; set; } 
    // some more Properties 
    

    和私人領域,像這樣的屬性:

    private States _state = States.State1; // State1 is the default state 
    
    public States State 
    { 
        get { return _state; } 
        set 
        { 
        if (_state != value) 
        { 
         _state = value; 
         OnPropertyChanged("State"); 
        } 
        } 
    } 
    
  • 在我的XAML我想在列表視圖中顯示MyObjects的列表,併爲我的枚舉的每個狀態顯示五個單選按鈕。我這樣做如下:

    <ListView x:Name="myObjectsListView" 
          ItemsSource="{Binding MyObjectList}"> 
        <ListView.View> 
        <GridView> 
         <GridViewColumn DisplayMemberBinding="{Binding ObjectName}" 
             Header="Object Name" 
             Width="Auto"/> 
         <!-- some more GridViewColumns --> 
        </GridView> 
        </ListView.View> 
    </ListView> 
    <StackPanel> 
        <RadioButton x:Name="state1RB" 
         Content="{x:Static States.State1}" 
         IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State, 
          UpdateSourceTrigger=PropertyChanged, 
          Converter={StaticResource enumToBool}, 
          ConverterParameter={x:Static States.State1}, 
          Mode=TwoWay}"/> 
    
        <RadioButton x:Name="state2RB" 
         Content="{x:Static States.State2}" 
         IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State, 
          UpdateSourceTrigger=PropertyChanged, 
          Converter={StaticResource enumToBool}, 
          ConverterParameter={x:Static States.State2}, 
          Mode=TwoWay}"/> 
    
        <RadioButton x:Name="state3RB" 
         Content="{x:Static States.State3}" 
         IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State, 
          UpdateSourceTrigger=PropertyChanged, 
          Converter={StaticResource enumToBool}, 
          ConverterParameter={x:Static States.State3}, 
          Mode=TwoWay}"/> 
    
    
        <RadioButton x:Name="state4RB" 
         Content="{x:Static States.State4}" 
         IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State, 
          UpdateSourceTrigger=PropertyChanged, 
          Converter={StaticResource enumToBool}, 
          ConverterParameter={x:Static States.State4}, 
          Mode=TwoWay}"/> 
    
        <RadioButton x:Name="state5RB" 
         Content="{x:Static States.State5}" 
         IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State, 
          UpdateSourceTrigger=PropertyChanged, 
          Converter={StaticResource enumToBool}, 
          ConverterParameter={x:Static States.State5}, 
          Mode=TwoWay}"/> 
    </StackPanel> 
    
  • 我使用的是EnumToBoolean轉換器,它看起來是這樣的:

    [ValueConversion(typeof(System.Enum), typeof(bool))] 
    public class EnumToBooleanConverter : IValueConverter 
    { 
        public object Convert (object value, Type targetType, object parameter, CultureInfo culture) 
        { 
        return value.Equals (parameter); 
        } 
    
        public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture) 
        { 
        if ((Boolean)value) 
         return parameter; 
        return null; 
        } 
    } 
    

的綁定工作,單選按鈕的作品,但問題的顯示器是當我檢查ListView中第一個元素的另一個單選按鈕時, State被正確保存。當我現在更改ListView中選定的項目,然後再次選擇ListView中的第一個項目時,沒有選中單選按鈕,因爲State屬性的獲取器不會被調用。

我正在尋找一個解決方案,但我的具體問題是,我有一個MyObjects其中包含一個狀態和更改選定的項目,選定的單選按鈕也應該改變的列表。

我希望有人瞭解我的問題,並可以提供幫助。

由於提前, 邁克

+1

您可能對[此問題]感興趣(http://stackoverflow.com/questions/9145606/),因爲您的代碼相當多。 –

+0

感謝您的提示。我用[this](http://stackoverflow.com/a/9145914/1384848)答案來解決我的問題。它工作得很好。 –

回答

0

您的代碼有效,我已經在全新項目中重新創建了所有代碼,並在更改SelectedItem時正確更新單選按鈕以反映最新值(即將選擇更改爲非默認值後) 。

我認爲你必須在其中干擾項目別的東西,你應該嘗試取出溶液中片和隔離測試出來。

0

如果你使用MVVM,我找到了一個好辦法用一個ICommand更新視圖模型中的SelectedItem是。 XAML看起來像這樣。

<RadioButton x:Name="state5RB" 
    Content="{x:Static States.State5}" 
    Command="{Binding UpdateSelectedItemCommand}" 
    IsChecked="{Binding Path=State, 
     UpdateSourceTrigger=PropertyChanged, 
     Converter={StaticResource enumToBool}, 
     ConverterParameter={x:Static States.State5}, 
     Mode=TwoWay}"> 
     <RadioButton.CommandParameter> 
      <myEnum:State>State5</myEnum:State>   
     </RadioButton.CommandParameter> 

    </RadioButton> 

視圖模型會是這個樣子:

ICommand UpdateSelectedItemCommand {get;set;} 

.. 

UpdateSelectedItemCommand = new DelegateCommand((param) => 
{ 
    State= (States) param; 
}); 

與實現的ICommand您的自定義對象替換DelegateCommand。