Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF Textboxbinding:在空文本框后使用exception和want_C#_Wpf_Textbox - Fatal编程技术网

C#WPF Textboxbinding:在空文本框后使用exception和want

C#WPF Textboxbinding:在空文本框后使用exception和want,c#,wpf,textbox,C#,Wpf,Textbox,我为一些管理任务编写了一个WPF用户应用程序,最后我准备好了。。。最后一个问题: 我有两个文本框控件,我不想让用户同时填充这两个控件,所以我这样做了: private string versichertennummerAlt = ""; public string VersichertennummerAlt { get { return versichertennummerAlt; }

我为一些管理任务编写了一个WPF用户应用程序,最后我准备好了。。。最后一个问题:

我有两个文本框控件,我不想让用户同时填充这两个控件,所以我这样做了:

      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;
                }
            }
    }