我是想實現一個用戶控件稱爲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