2

私は次の状況を持っています:

  • オブジェクトのリスト ( List<MyObjects>) があります。
  • クラス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 では、リストをMyObjectsListView に表示し、列挙型の状態ごとに 5 つのラジオ ボタンを表示したいと考えています。私は次のようにこれを行います:

    <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状態を含むリストがあり、選択した項目を変更すると、選択したラジオボタンも変更する必要があることです。

誰かが私の問題を理解し、助けてくれることを願っています。

前もって感謝します、マイク

4

2 に答える 2

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>

ViewModel は次のようになります。

ICommand UpdateSelectedItemCommand {get;set;}

..

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

DelegateCommand を、ICommand を実装するカスタム オブジェクトに置き換えます。

于 2012-05-09T15:07:24.577 に答える
0

あなたのコードは機能します。新しいプロジェクトですべて再作成しました。SelectedItem を変更すると (つまり、選択をデフォルト以外に変更した後)、最新の値を反映するようにラジオ ボタンが正しく更新されます。

プロジェクトに干渉している何かがあると思います。ソリューションの一部を取り出して、それらを個別にテストする必要があります。

于 2012-05-09T15:25:30.397 に答える