0

MVVMUIのラジオボタンごとに個別のIsChecked*SomePropertyName*を作成するのに飽きることがあります。別の方法は、各ボタンに名前を付け、IsChecked = trueであるボタンを見つけて、その名前を私の強力なテキストモデルで意味のあるものに変換することです。

このすべての厄介なロジックをカプセル化するコレクションをSilverlightやWPFに戻す方法があれば、それは素晴らしいことです。私のコードのユースケースの例は次のとおりです。

<Page x:Name="idHost"
      ...>

<TextBlock Text="{Binding Path=RadioButtonSource.CurrentEnabledButton, Mode=OneWay, StringFormat='Selected Filter: {0}', TargetNullValue='Selected Filter: not selected', ElementName=idHostPage}" />
<RadioButton IsChecked="{Binding Path=RadioButtonSource[Inherited], Mode=TwoWay, ElementName=idHostPage}"
             IsThreeState="False"
             GroupName="PostFilter"
             Content="Inherited" />
<RadioButton IsChecked="{Binding Path=RadioButtonSource[Direct], Mode=TwoWay, ElementName=idHostPage}"
             IsThreeState="False"
             GroupName="PostFilter"
             Content="Direct" />
...

ページの背後にあるコードは次のようになります。

public partial class MyPage : Page {

    public MyPage() {
        this.RadioButtonSource = new RadioButtonSource();
    }

    public RadioButtonSource RadioButtonSource {
        get { return (RadioButtonSource)GetValue(RadioButtonSourceProperty); }
        set { SetValue(RadioButtonSourceProperty, value); }
    }

    public static readonly DependencyProperty RadioButtonSourceProperty = DependencyProperty.Register("RadioButtonSource", typeof(RadioButtonSource), typeof(MyPage), new PropertyMetadata(null));
}
4

1 に答える 1

0

これは、私がすでに開発した私の質問に対する解決策です。この忙しい作業をすべて1つの再利用可能なクラスにカプセル化する単一のクラス。

public class RadioButtonSource : INotifyPropertyChanged {

    #region Member Field(s)

    Dictionary<string, bool> m_RadioButtonFlags;

    #endregion

    #region Event(s)

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Con/Destructor(s)

    public RadioButtonSource() {
        this.m_RadioButtonFlags = new Dictionary<string, bool>();
    }

    #endregion

    #region Exposed Proper(y|ies)

    public string CurrentEnabledButton {
        get {

            var q = from key in this.m_RadioButtonFlags.Keys
                    where this.m_RadioButtonFlags[key]
                    select key;

            return q.FirstOrDefault();
        }
    }

    [IndexerName("Item")]
    public bool this[string radioButtonName] {
        get {

            if (string.IsNullOrEmpty(radioButtonName))
                throw new ArgumentNullException("radioButtonName");
            if (this.m_RadioButtonFlags.ContainsKey(radioButtonName))
                return this.m_RadioButtonFlags[radioButtonName];

            var returnValue = false;
            this.m_RadioButtonFlags.Add(radioButtonName, returnValue);
            return returnValue;
        }
        set {

            if (string.IsNullOrEmpty(radioButtonName))
                throw new ArgumentNullException("radioButtonName");

            if (this.CurrentEnabledButton == radioButtonName)
                return;

            this._ChangeFlags(radioButtonName);

            if (this.PropertyChanged != null) {
                this.PropertyChanged(this, new PropertyChangedEventArgs("Item[]"));
                this.PropertyChanged(this, new PropertyChangedEventArgs("CurrentEnabledButton"));
            }
        }
    }

    #endregion

    #region Method(s)

    void _ChangeFlags(string radioButtonName) {

        if (string.IsNullOrEmpty(radioButtonName))
            throw new ArgumentNullException("radioButtonName");
        if (!this.m_RadioButtonFlags.ContainsKey(radioButtonName))
            this.m_RadioButtonFlags.Add(radioButtonName, true);

        foreach (var key in this.m_RadioButtonFlags.Keys.ToArray()) {
            if (key != radioButtonName)
                this.m_RadioButtonFlags[key] = false;
            else
                this.m_RadioButtonFlags[key] = true;
        }
    }

    #endregion
}

お役に立てれば。メリークリスマスと神のご加護を。

  • ラシャド
于 2012-12-20T16:40:39.757 に答える