カスタムコントロールを作成しました。これは、3つのラジオボタンと、、、、またはのいずれかになり得るAnswer
タイプのプロパティです。ラジオボタンをクリックするとプロパティが変更されます。プロパティを変更すると、選択されているラジオボタンが変更されます。DependancyPropertyとして実装されているため、データバインディングを実行できます(ソースはEF4エンティティのプロパティです)。string
"Yes"
"No"
"N/A"
Answer
Answer
Answer
データベース内の列の値が呼び出しで指定されたデフォルトと一致する場合を除いて、すべてうまく機能します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>