1

WPF で MVVM モデルを使用して簡単なプログラムを作成しています。基本的に、ユーザーがラジオ ボタンのグループのラジオ ボタンをクリックすると、ビュー モデルのプロパティが新しいアカウント番号で更新されます。問題は、別のボタンをクリックすると、新しいボタン IsChecked Binding に対してコンバーターが呼び出され、その後、前のボタン IsChecked バインディングに対してコンバーターが実行されることです (チェックされた状態を失うため)。

新しいボタンが正しいアカウント番号でプロパティの値を更新し、古いボタンがコンバーターを呼び出すと、古い値に変換されるため、これが問題を引き起こしています。クラスに静的変数を追加することで機能するようにハッキングしました。IsChecked プロパティが false の場合は、静的変数の値を返すだけです。チェックされたステータスを失うボックスでコンバーター呼び出しを回避するためのより良い解決策はありますか。コードは以下のとおりです。

コンバータ:

class RadioToAccountConverter : IValueConverter
{
    static string myValue; //HACK TO MAKE IT WORK
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return parameter.ToString();
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if ((bool)value)
        {
            myValue = parameter.ToString(); // Hack to make it work
            return parameter.ToString();
        }
        return myValue; // Hack to make it work
    }
}

XAML:

                <RadioButton Foreground="HotPink" 
                             Grid.Column="0" 
                             Content="6087721" 
                             Tag="6087721"
                             IsChecked="{Binding Account, Converter={StaticResource Radio2Value}, Mode=OneWayToSource, ConverterParameter=6087721}">
                </RadioButton>

                <RadioButton Foreground="HotPink" 
                             Grid.Column="1"
                             Content="BFSC120"
                             IsChecked="{Binding Account, Converter={StaticResource Radio2Value}, Mode=OneWayToSource, ConverterParameter='BFSC120'}">
                </RadioButton>

                <RadioButton Foreground="HotPink" 
                             Grid.Column="2"
                             Content="BFSC121"
                             IsChecked="{Binding Account, Converter={StaticResource Radio2Value}, Mode=OneWayToSource, ConverterParameter=BFSC121}">
                </RadioButton>

                <RadioButton Foreground="HotPink" 
                             Grid.Column="3" 
                             Content="BFSC206" 
                             IsChecked="{Binding Account, Converter={StaticResource Radio2Value}, Mode=OneWayToSource, ConverterParameter=BFSC206}">

                </RadioButton>

財産:

    public const string AccountPropertyName = "Account";

    private string _account;

    /// <summary>
    /// Sets and gets the Account property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public string Account
    {
        get
        {
            return _account;
        }

        set
        {
            if (_account == value)
            {
                return;
            }

            RaisePropertyChanging(AccountPropertyName);
            _account = value;
            RaisePropertyChanged(AccountPropertyName);
        }
    }

どんな助けでも大歓迎です。

4

2 に答える 2

3

私が理解していることに基づいて、ユーザーがアカウント番号のリストから選択できるようにしたいと考えています。プレゼンテーションの選択 (ビュー) は、ラジオ ボタンのグループです。

その場合、重要な部分は次のとおりです。ユーザーが口座番号のリストから選択できるようにする必要があります。これは、ユーザーが適切な値のいずれかListBoxを選択する必要があるため、使用する必要があるコントロールが であることを意味します。ここで、ラジオ ボタンを視覚的に使用することを検討しているので、単に代替を提供する必要があります。ItemsSource.ItemContainerStyle


XAML:

<ListBox ItemsSource="{Binding AccountNumbers, Mode=OneWay">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBoxItem}">
            <RadioButton Content="{Binding}" IsChecked="{Binding IsSelected, RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

ViewModel に別のプロパティを追加する必要があることに注意してください (私は AccountNumbers と名付けました)。例えば:

public IReadOnlyCollection<string> AccountNumbers { ... }

もちろん、必要に応じて基になるコレクションを監視可能にすることもできますが、それはあなた次第です。

于 2013-05-23T00:25:48.680 に答える
1

GroupNameon eachを定義するとRadioButton、WPF がIsChecked状態を管理します。

{Binding SomeProperty, Mode=OneWayToSourceViewModel に状態を認識させたい場合は、状態を } でバインドできます。

これにアプローチする 1 つの方法は、各 RadioButton のIsCheckedプロパティを ViewModel 全体にバインドすることです。

IsChecked="{Binding WholeViewModel, Mode=OneWayToSource, Converter={StaticResource MyRadioButtonConverter}, ConverterParameter=SomethingReallyUnique}"

...パブリック プロパティWholeViewModelreturn this;、getter で a を実行するプロパティです。これにより、ViewModel にアクセスできるようになり、ViewModel にクエリを実行してラジオボタンをオンにするかどうかを確認するのに十分な情報が得られます。ただし、これは、GroupName DependencyProperty必要なものが得られない場合にのみ行ってください。

ボタンのクリックを処理し、ViewModel の状態を実際に変更するには、ViewModel に ICommand を実装し、RadioButton の Command プロパティを {Binding ClickedCommand} にバインドし、任意の文字列で CommandParameter を定義します。このアプローチは、 IsChecked 状態との一方向の関係を保証し、あなたが説明していることを防ぎます。

必要に応じて、コード サンプルを作成します。

于 2013-05-23T00:24:57.387 に答える