IDataErrorInfo与MVVM Light消息传递一起重新附加

时间:2014-03-31 14:48:51

标签: c# wpf mvvm mvvm-light idataerrorinfo

对于我正在进行的项目,我使用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:)

1 个答案:

答案 0 :(得分:0)

由于对话行为,我每次创建对话框时都选择重新创建viewmodel。也许还可以做更好的事情,以防止旧的/以前的数据出现任何未来的“奇怪”行为。

viewmodel不以这种方式表示任何状态。