0

リストビューにラジオボタングループがあります。このリストビューの行 (とりわけラジオ ボタン grp を含む) は、観察可能なコレクションです。

私が書いたコードは次のようになります。

Xaml:

    <RadioButton Content="EnumValueName1"
             GroupName="RadButGrp1"
             IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName1}" >
 </RadioButton>
 <RadioButton Content="EnumValueName2" 
              GroupName="RadButGrp1"
              IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName2}">
 </RadioButton>
<RadioButton Content="EnumValueName3" 
              GroupName="RadButGrp1"
              IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName3}">
 </RadioButton>

これらの値を保持するテーブルを定義するデータ構造で、propertyName というデータ フィールドに直接バインドしようとしています。このビューの ViewModel クラスにこのフィールドがありません。これは、現在入力しているコレクションのインデックスを追跡しないようにするためです。(またはそう思いたい!)

コンバーター:

 public class EnumBooleanConverter : IValueConverter
 {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter as string;
        if (parameterString == null)
            return DependencyProperty.UnsetValue;

        if (value == null || Enum.IsDefined(value.GetType(), value) == false)
            return DependencyProperty.UnsetValue;

        object parameterValue = Enum.Parse(value.GetType(), parameterString);

        return parameterValue.Equals(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter as string;
        if (parameterString == null || value.Equals(false))
            return DependencyProperty.UnsetValue;

        return Enum.Parse(targetType, parameterString);
    }
 }

問題は、Enum.Parse 行の ConvertBack 関数で、次の Argument 例外が発生することです。

提供される型は Enum でなければなりません。パラメータ名: enumType

バインディングに列挙型を返す方法はありますか? どの列挙値を表すかをラジオボタンに伝えるにはどうすればよいですか? バインディングに適切な列挙値を返す関数を作成するにはどうすればよいですか?

皆さんが助けてくれることを願っています。前もって感謝します!

4

3 に答える 3

0

コンセプトを正しく理解すれば、解決策は比較的簡単でした。私は次のことを行い、問題を部分的に解決しました。

 <RadioButton Content="EnumValueName1" 
              GroupName="RadBtnGrp1"
              IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ParentControl}},
                                  Path=DataContext.propName,
                                  Mode=TwoWay,
                                  Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName1}">

 </RadioButton>

ConvertBack 関数の targetType が正しい列挙型になりました。お役に立てれば!

ここで、ラジオボタンがリストビューの複数の行で選択を保持する方法を理解する必要があります。現在、最初の行を選択すると、同じグループが残りの行から選択解除されます。

これまでお世話になりました。誰かが私に新しい問題の解決策を教えてくれたら、それは本当に素晴らしいことです!

于 2013-03-13T11:36:24.037 に答える
0

これを試してください、それはの私のバージョンですEnumToBoolConverter

public class EnumToBoolConverter : BaseConverterMarkupExtension<object, bool>
{
    public override bool Convert(object value, Type targetType, object parameter)
    {
        if (value == null)
            return false;

        return value.Equals(Enum.Parse(value.GetType(), (string)parameter, true));
    }

    public override object ConvertBack(bool value, Type targetType, object parameter)
    {
        return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
    }
}
于 2013-03-12T15:00:40.417 に答える