WPF 使用MultiBinding ,TwoWay ,ValidationRule ,需要注意的事项

2016-08-20 10:36:30来源:http://muzizongheng.blog.51cto.com/856912/1333108作者:muzizongheng人点击


<?xml version="1.0" encoding="UTF-8"?> 当wpf使用multibinding时, 其内部的validaterule的value 是其多个Binding的值, 要根据情况去验证, 还有就是在做IMultiConverter的ConvertBack时注意TargetType
如: 以下是一个Textbox通过MultiBinding绑定到后台 的字段, 以及前台的一个radiobutton, 该textbox有个validaterule。


<TextBox x:Name="txtPatientWeight" TextWrapping="Wrap" Margin="3" MaxLength="5" TabIndex="6" BorderBrush="Black" Grid.Row="5" Grid.Column="1" Height="22" MinWidth="42" Tag="PatientWeight" Visibility="{Binding DataContext, ElementName=window, Converter={StaticResource KeyToVisibilityConverter}, ConverterParameter=PatientWeight}"> <MultiBinding Mode="TwoWay" Converter="{StaticResource WeightConverter}" UpdateSourceTrigger="PropertyChanged"> <MultiBinding.ValidationRules> <McsfPAFEContainee_ValidationRules:WeightValidationRule ValidatesOnTargetUpdated="True" ValidationStep="ConvertedProposedValue"/> </MultiBinding.ValidationRules> <Binding Path="PatientWeight"/> <Binding Path="IsChecked" ElementName="rdoKg"/> </MultiBinding> <i:Interaction.Behaviors> <McsfPAFEContainee_Behaviors:NumericTextBoxBehavior MinValue="0" MaxValue="300" /> </i:Interaction.Behaviors> </TextBox>////////////////////////<RadioButton x:Name="rdoKg" Content="kg" GroupName="WeightMeasure" d:LayoutOverrides="GridBox" MinWidth="34" Margin="5,0,0,0" Tag="PatientWeight" HorizontalAlignment="Center"> <RadioButton.IsChecked> <Binding Path="DataContext" Mode="TwoWay" ElementName="window" Converter="{StaticResource DefaultUnitConverter}" ConverterParameter="kg" UpdateSourceTrigger="PropertyChanged"></Binding> </RadioButton.IsChecked> </RadioButton>
//////////////private string patientWeight = "";//(0010,1030) Patient Weight PatientWeight DS unit kg
public string PatientWeight { get { return patientWeight; } set { if (value == patientWeight) { return; }
patientWeight = value; OnPropertyChanged("PatientWeight"); } }

//////////converterpublic class WeightConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (null == values || 2 != values.Length ) { return ""; }
string unit = ""; string temp = values[0].ToString();
if (String.IsNullOrEmpty(temp)) { return ""; }
if (0 <= temp.IndexOf("lb")) { unit = "lb"; } else if (0 <= temp.IndexOf("kg")) { unit = "kg"; } else { return ""; }
string number = ""; number = temp.Substring(0, temp.IndexOf(unit));
//KG if ((bool)values[1]) { measurementUnit = "kg"; } else //LB { measurementUnit = "lb"; }
return ConvertToTargetValue(number, unit, measurementUnit); }
private string measurementUnit = ""; public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { string temp = value.ToString();
if (String.IsNullOrEmpty(temp)) { return new object[]{DependencyProperty.UnsetValue, DependencyProperty.UnsetValue}; }
if (String.IsNullOrEmpty(measurementUnit)) { measurementUnit = (PAFEContainee.MainDataContext as MainViewModel).PRCfgVM.IsDefaultKilogram ? "kg" : "lb"; }
object[] list = new object[2]; list[0] = value.ToString() + measurementUnit; list[1] = measurementUnit.Equals("kg") ? "true" : "false";
return list; }
private string ConvertToTargetValue(string before, string beforeUnit, string afterUnit) { string result = "";
if (beforeUnit.Equals(afterUnit)) { return before; }
switch (afterUnit) { case "lb": result = ConvertKgToPound(before).ToString(); break; case "kg": result = ConvertPoundToKg(before).ToString(); break; default: break; }
return result; }
private double ConvertPoundToKg(string pound) { double kg = 0.4536 * double.Parse(pound);
return kg; }
private double ConvertKgToPound(string kg) { double pound = 2.20 * double.Parse(kg);
return pound; }
}

///////ValidationRulepublic override ValidationResult DoValidate(object value, CultureInfo cultureInfo) { try {
//string field = value.ToString().Trim(); string field = (value as object[])[0].ToString(); string pattern = @"^([1-9]|[1-9][0-9]|[1-5][0-9][0-9]|600)((kg)|(lb))$";
Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);
if (field.Length <= 0 || false == reg.IsMatch(field)) { return new ValidationResult(false, "Please input a number, for example '60'"); } else { return ValidationResult.ValidResult; } } catch { return new ValidationResult(false, "Patient weight convert failed."); }
}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台