对于我正在进行的项目,我使用IDataErrorInfo来验证用户输入。我也使用MVVM光消息传递。但似乎错误处理重新附加在每个ShowDialog上,导致验证多次发生,并在每次显示对话框时堆叠。 ViewModel在打开/关闭期间保留,不会重新创建。
查看(文本框)
<TextBox Name="LPNInput" Grid.Column="1" VerticalAlignment="Center"
HorizontalAlignment="Stretch" Margin="10,40,10,10"
Text="{Binding Path=LPN, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
extensions:FocusExtension.IsFocused="True">
<TextBox.Style>
<Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource LpnValidationErrorTemplate}" />
</Style>
</TextBox.Style>
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=SubmitLPNCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
ViewModel RequestInputViewModel
private string lpn;
public string LPN
{
get { return lpn; }
set
{
lpn = value; RaisePropertyChanged("LPN");
}
}
public string Error { get; private set; }
public string this[string propertyName]
{
get
{
string errorMsg = string.Empty;
if (propertyName.Equals("LPN"))
{
pannenkoek++;
if (!string.IsNullOrEmpty(lpn))
{
if (!LicensePlateNumber.IsValidLPN(lpn))
{
errorMsg = XmlTextProvider.GetHeader("LPNInvalid");
}
else if (!someManager.CanAddBag(LicensePlateNumber.Parse(lpn)))
{
errorMsg = XmlTextProvider.GetHeader("LPNDuplicate");
}
}
}
Error = errorMsg;
return Error;
}
}
private void Close(bool dialogResult)
{
System.Diagnostics.Debug.WriteLine(string.Format("Pannenkoeken: {0}", pannenkoek));
// Notify the view to close the dialog
Messenger.Default.Send<CloseWindowMessage, RequestInputDialog>(new CloseWindowMessage(this, dialogResult));
}
ViewModel#2
RequestLPNViewModel是在viewmodel#2的构造函数中创建的。
Application.Current.Dispatcher.BeginInvoke(new Action(() => Messenger.Default.Send<ShowDialogMessageBase, MainView>(new ShowDialogMessage<RequestInputDialog>(this, RequestInputViewModel, InputEntered))));
调试输出中的输出
Pannenkoeken:2 Pannenkoeken:4 Pannenkoeken:6 Pannenkoeken:8
我不希望数字增加。我希望4倍于数字2.似乎错误绑定附加在对话框的创建上,但在对话框关闭时不会释放。是的,在打开时重置int:)
答案 0 :(得分:0)
由于对话行为,我每次创建对话框时都选择重新创建viewmodel。也许还可以做更好的事情,以防止旧的/以前的数据出现任何未来的“奇怪”行为。
viewmodel不以这种方式表示任何状态。