0

カスタムコントロールを作成しました。これは、3つのラジオボタンと、、、、またはのいずれかになり得るAnswerタイプのプロパティです。ラジオボタンをクリックするとプロパティが変更されます。プロパティを変更すると、選択されているラジオボタンが変更されます。DependancyPropertyとして実装されているため、データバインディングを実行できます(ソースはEF4エンティティのプロパティです)。string"Yes""No""N/A"AnswerAnswerAnswer

データベース内の列の値が呼び出しで指定されたデフォルトと一致する場合を除いて、すべてうまく機能しますDependencyProperty.Register()。この場合、コントロールはラジオボタンがチェックされていない状態で表示されます。

デバッガーがプロパティセッターをステップオーバーするオプションをオフにしました。SetChecks()が呼び出されIsChecked、ラジオボタンのプロパティがtrueに設定されていると思われます。

プロパティのデフォルトを変更すると、それはチェックされない値になります...MyIdビューにこれらのコントロールが複数あるため、デバッガーで見ている特定のコントロールを識別するためだけに配置されました。

最初の.csコード:

public partial class YesNoNotApplicableRadio : UserControl, INotifyPropertyChanged {
    public string MyId {
        get;
        set;
    }

    public static readonly DependencyProperty AnswerProperty = DependencyProperty.Register(
        "Answer",
        typeof(string),
        typeof(YesNoNotApplicableRadio),
        new FrameworkPropertyMetadata("N/A",
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            new PropertyChangedCallback(AnswerPropertyChanged),
            new CoerceValueCallback(CoerceAnswer)
            ),
        new ValidateValueCallback(ValidateAnswer)
        );

    public static bool ValidateAnswer(Object value) {
        string s = value as string;
        if (s == null)
            return true;
        s = s.Trim().ToUpper();
        if (s.Equals("YES") || s.Equals("NO") || s.Equals("N/A") || s.Equals(""))
            return true;
        return false;
    }

    public static void AnswerPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        YesNoNotApplicableRadio o = d as YesNoNotApplicableRadio;
        string val = (string)e.NewValue;
        SetChecks(o, val.Trim().ToUpper());
    }

    private static void SetChecks(YesNoNotApplicableRadio selector, string val) {
        selector.YesRadio.IsChecked = false;
        selector.NoRadio.IsChecked = false;
        selector.NaRadio.IsChecked = false;
        if (val.Equals("YES"))
            selector.YesRadio.IsChecked = true;
        else if (val.Equals("NO"))
            selector.NoRadio.IsChecked = true;
        else if (val.Equals("N/A") || val.Equals(""))
            selector.NaRadio.IsChecked = true;
    }

    private void Radio_Click(object sender, RoutedEventArgs e) {
        if ((bool)YesRadio.IsChecked)
            Answer = "Yes";
        else if ((bool)NoRadio.IsChecked)
            Answer = "No";
        else
            Answer = "N/A";
    }

    public static Object CoerceAnswer(DependencyObject d, Object baseValue) {
        YesNoNotApplicableRadio o = (YesNoNotApplicableRadio)d;
        string s = baseValue as string;
        if (s == null)
            return ("N/A");
        else
            return (s);
    }

    public string Answer {
        get { return ((string)GetValue(AnswerProperty)); }
        set { SetValue(AnswerProperty, value); NotifyPropertyChanged("Answer"); }
    }

    public YesNoNotApplicableRadio() {
        InitializeComponent();
        Guid groupGuid = System.Guid.NewGuid();
        YesRadio.GroupName = groupGuid.ToString();
        NoRadio.GroupName = groupGuid.ToString();
        NaRadio.GroupName = groupGuid.ToString();

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string name) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

これが.xaml

<UserControl x:Class="RovingAuditEntry.Controls.YesNoNotApplicableRadio"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="30" d:DesignWidth="130">
    <StackPanel Orientation="Horizontal" Margin="5">
        <RadioButton Content="Yes" Height="16" Name="YesRadio" Click="Radio_Click" />
        <RadioButton Content="No" Height="16" Name="NoRadio" Margin="5,0,0,0" Click="Radio_Click" />
        <RadioButton Content="N/A" Height="16" Name="NaRadio" Margin="5,0,0,0" Click="Radio_Click" />
    </StackPanel>
</UserControl>
4

1 に答える 1

0

私は解決策を見つけましたが、それはおそらく正しいものではありません。コントロールへの有効な入力は、、null空の文字列、、、、"Yes"および"No""N/A"任意の大文字)です。私の強制関数はnull文字列をに変換して空にします"N/A"。関数に渡されるデフォルト値をからに変更することにより、Register()関数が機能する"N/A"よう""になりました。

まだもっと良い答えを探していますが、答えがない場合は、自分で答えます。

于 2012-12-27T16:05:01.733 に答える