C#WPF Textboxbinding:在空文本框后使用exception和want
我为一些管理任务编写了一个WPF用户应用程序,最后我准备好了。。。最后一个问题: 我有两个文本框控件,我不想让用户同时填充这两个控件,所以我这样做了:C#WPF Textboxbinding:在空文本框后使用exception和want,c#,wpf,textbox,C#,Wpf,Textbox,我为一些管理任务编写了一个WPF用户应用程序,最后我准备好了。。。最后一个问题: 我有两个文本框控件,我不想让用户同时填充这两个控件,所以我这样做了: private string versichertennummerAlt = ""; public string VersichertennummerAlt { get { return versichertennummerAlt; }
private string versichertennummerAlt = "";
public string VersichertennummerAlt
{
get { return versichertennummerAlt; }
set
{
if (Versichertennummer.Length > 0)
{
versichertennummerAlt = "";
OnPropertyChanged("VersichertennummerAlt");
throw new ArgumentException("Es kann nur die neue ODER die alte Versichertennummer eingegeben werden.\n Eine von beiden löschen.");
}
........
}
}
它的工作方式应该是这样的,如果用户试图同时填充这两个键,我会得到一个异常,字符串是“”,但不知何故,文本框仍然显示上次按下的键,即使属性是“”
我做错了什么?
或者如何确保文本框在异常之后不显示任何内容
感谢您的帮助:)除非您在某个地方捕获并处理异常,否则您不希望以这种方式使用异常。在文本框中输入文本永远不会是致命的。除此之外,我认为按照评论中的建议操作是一个好主意,即,如果另一个文本框中有文本,则创建一个文本框
IsEnabled=“False”
,反之亦然:
XAML:
您还需要为TextBoxB
执行此操作。当另一个有文本时,上面应该禁用一个
编辑
要解决您关于红色钻孔虫等的评论,您需要实现IDataErrorInfo
#region IDataErrorInfo Implementation.
/// <summary>
/// Access to the error.
/// </summary>
string IDataErrorInfo.Error
{
get { return String.Empty; }
}
/// <summary>
/// Get the validation error.
/// </summary>
/// <param name="propertyName">The name of the property to validate.</param>
/// <returns>The error information as a string.</returns>
string IDataErrorInfo.this[string propertyName]
{
get { return ExecuteValidation(); }
}
/// <summary>
/// Run validation routines.
/// </summary>
/// <returns>Error message.</returns>
private string ExecuteValidation()
{
// Put validation for the other TextBox here.
return String.Empty;
}
#endregion // IDataErrorInfo Implementation.
#区域IDataErrorInfo实现。
///
///访问错误。
///
字符串IDataErrorInfo.Error
{
获取{return String.Empty;}
}
///
///获取验证错误。
///
///要验证的属性的名称。
///错误信息以字符串形式显示。
字符串IDataErrorInfo。此[string propertyName]
{
获取{return ExecuteValidation();}
}
///
///运行验证例程。
///
///错误消息。
私有字符串ExecuteValidation()
{
//将另一个文本框的验证放在此处。
返回字符串。空;
}
#endregion//IDataErrorInfo实现。
用法如下:
<TextBox Text="{Binding SomeTextProperty,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
NotifyOnValidationError=True}"/>
然后,当验证失败时,将突出显示错误
我希望这有帮助
注意。要使上述功能正常工作,您需要实现INotifyPropertyChanged尝试在文本框绑定更新中使用SourceTrigger=PropertyChanged我尝试实现这种情况:
private string versichertennummer = "";
public string Versichertennummer
{
get { return versichertennummer; }
set
{
if (VersichertennummerAlt.Length > 0)
{
MessageBox.Show("Es kann nur die neue ODER die alte Versichertennummer eingegeben werden.\n Eine von beiden löschen.");
//OnPropertyChanged("Versichertennummer");
return;
}
else
{
versichertennummer = value;
}
}
}
private string versichertennummerAlt = "";
public string VersichertennummerAlt
{
get { return versichertennummerAlt; }
set
{
if (Versichertennummer.Length > 0)
{
//versichertennummerAlt = "";
//OnPropertyChanged("VersichertennummerAlt");
MessageBox.Show("Es kann nur die neue ODER die alte Versichertennummer eingegeben werden.\n Eine von beiden löschen.");
return;
}
else
{
versichertennummerAlt = value;
}
}
}
我并没有像你们一样了解到这种情况。当第一个文本框控件被填充时,为什么不禁用第二个文本框控件呢?然后用户甚至不能在我考虑的第二时间尝试编写,但它不适合应用程序的布局。(如果我在DataGrid中单击,其中一个字段会被填充,我想如果整天有两个文本框从enabled(启用)切换到disabled(禁用),那么锁就不好了)为什么不设置IsReadOnly属性?:)它不会影响文本框的布局和样式。您正在将私有变量设置为=“”这不会影响用户界面,因为没有OnPropertyChanged事件
versichertennumeralt=“”代码>嗯,我想我只是无一例外地这样做,并且在另一个框被填满时使其无法写入:)问题是,我想给用户一个提示,他一次只能使用其中一个框(当他尝试时..像红色边框或其他任何东西)。但是thx;)然后您需要在文本框上实现IDataErrorInfo
。嗯,是的,我想这就是我想要的;)嗯,你能告诉我怎么用吗?;)
<TextBox Text="{Binding SomeTextProperty,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
NotifyOnValidationError=True}"/>
private string versichertennummer = "";
public string Versichertennummer
{
get { return versichertennummer; }
set
{
if (VersichertennummerAlt.Length > 0)
{
MessageBox.Show("Es kann nur die neue ODER die alte Versichertennummer eingegeben werden.\n Eine von beiden löschen.");
//OnPropertyChanged("Versichertennummer");
return;
}
else
{
versichertennummer = value;
}
}
}
private string versichertennummerAlt = "";
public string VersichertennummerAlt
{
get { return versichertennummerAlt; }
set
{
if (Versichertennummer.Length > 0)
{
//versichertennummerAlt = "";
//OnPropertyChanged("VersichertennummerAlt");
MessageBox.Show("Es kann nur die neue ODER die alte Versichertennummer eingegeben werden.\n Eine von beiden löschen.");
return;
}
else
{
versichertennummerAlt = value;
}
}
}