我是想实现一个用户控件称为ParityTypeSelect
包含两个单选按钮 - Odd
& Even
,并且用户控件是有一个DependencyProperty称为ParityType
这是会在双向绑定使用。这个想法很简单 - 如果Odd
选择ParityType
应该返回1,如果Even
选择ParityType
应该返回0
下面的代码 -在UserControl中实现双向绑定的自定义DependencyProperty的适当方法是什么?
XAML(用户控件):
<StackPanel Orientation="Horizontal">
<RadioButton Name="rdoOdd" Content="Odd" Margin="5" Checked="rdoOdd_CheckedChnaged" Unchecked="rdoOdd_CheckedChnaged" />
<RadioButton Name="rdoEven" Content="Even" Margin="5"/>
</StackPanel>
代码隐藏(用户控件):
public partial class ParityTypeSelect : UserControl
{
//Some Code
static ParityTypeSelect()
{
FrameworkPropertyMetadata parityTypeMetaData =
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnParityTypeChanged),
new CoerceValueCallback(CoerceParityTypeValue));
ParityTypeProperty = DependencyProperty.Register("ParityType", typeof(int?), typeof(ParityTypeSelect),
parityTypeMetaData,
new ValidateValueCallback(ValidateParityTypeValue));
}
public static readonly DependencyProperty ParityTypeProperty;
public int? ParityType
{
get { return (int?)GetValue(ParityTypeProperty); }
set { SetValue(ParityTypeProperty, value); }
}
private static void OnParityTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ParityTypeSelect select = (ParityTypeSelect)d;
int? newValue = (int?)e.NewValue;
if (newValue != null && newValue <= 1)
{
if (newValue == 1)
select.rdoOdd.IsChecked = true;
else
select.rdoEven.IsChecked = true;
}
else
return;
}
private void rdoOdd_CheckedChnaged(object sender, RoutedEventArgs e)
{
RadioButton radioButton = (RadioButton)sender;
if (radioButton.IsChecked != null)
{
if (radioButton.IsChecked.Value)
SetValue(ParityTypeProperty, 1);
else
SetValue(ParityTypeProperty, 0);
}
}
//Some more Code
}
XAML(消费者):
<StackPanel>
<aucl:ParityTypeSelect ParityType="{Binding Path=Format.FisrtBitType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
...它的工作。但事情是,这是我第一次执行DependencyProperty。所以我有点担心,如果我做对了。我是否正确使用了OnParityTypeChanged
方法?使用rdoOdd_CheckedChnaged
事件处理程序来设置proerty值是否正常?有没有更好或更合适的方法来完成这整个实施?我一直期待着高质量的编码。所以任何建议,改进建议,WPF
家伙的意见将非常感谢。
感谢那个“prpodp”魔术 - 虽然它提供了一个'UIPropertyMetadata',而不是'FrameworkPropertyMetadata',但它不知道类似这样的东西。我知道你建议使用'CustomControl'而不是'UserControl'。我不明白的是'IValueConverter'取代5/6行代码的优点。是不是这个'SomeProperty =“{Binding ... ...}''语法总是在场景后面生成一个事件处理程序? – atiyar 2012-07-19 02:07:14
有很多类似的片段,比如“cw”,“ctor”等。如果你需要FrameworkPropertyMetadata,那么你可以改变它。好处是有人可以将界面替换为您的控件,并将其制作成任何他们喜欢的东西,例如红色/绿色按钮。因为xaml中的逻辑可以完成。我还发现,当事件在加载过程中出现时序问题时变得更加复杂时,使用这些事件会变得困难。关于幕后的事件处理程序,我会说这很可能。它需要以某种方式利用这些变化。 – MikeKulls 2012-07-19 06:05:13