我有:
public class Person : INotifyPropertyChanged
{
private string _name;
public int Age { get; set; }
public string Name
{
get { return _name; }
set
{
if (!String.IsNullOrEmpty(_name))
{
if (String.IsNullOrEmpty(value))
{
throw new Exception("name couldn't be null");
}
else if ((_name.Equals(value) != true))
{
if (!String.IsNullOrEmpty(value))
{
throw new Exception("name couldn't be null");
}
else
{
InvokePropertyChanged("_name");
}
_name = value;
}
}
else if (String.IsNullOrEmpty(value))
{
throw new Exception("name couldn't be null");
}
else
{
_name = value;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void InvokePropertyChanged(string propertyName)
{
var e = new PropertyChangedEventArgs(propertyName);
PropertyChangedEventHandler changed = PropertyChanged;
if (changed != null) changed(this, e);
}
>
<Grid>
<StackPanel>
<TextBox Name="tbName" Text="{Binding Path=Name, Mode=TwoWay}"></TextBox>
<TextBox Name="tbOther" Text="Come in"></TextBox>
</StackPanel>
</Grid>
和
public UserControl1()
{
InitializeComponent();
Person person = new Person();
person.Name = "Patrick";
this.DataContext = person;
}
为什么我调试并进入以下行:
抛出新的异常(“名称不能为空”);
异常未显示。
答案 0 :(得分:2)
请参阅此other question,但基本上该异常将由Binding处理和抑制。
答案 1 :(得分:1)
您没有将控件设置为从我所看到的人物对象绑定。因此,它不应该尝试设置它并随后出错。
当你在吸气器中放置断点时,它是否会被调用?
答案 2 :(得分:1)
我认为你想将Person对象分配给控件的DataContext:
public UserControl1()
{
InitializeComponent();
Person person = new Person();
person.Name = "Patrick";
this.DataContext = person;
}
您可能还想在绑定上设置ValidatesOnExceptions,以便在设置器中抛出异常时,UI将显示错误模板。
<TextBox Name="tbName" Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=True}"></TextBox>
答案 3 :(得分:1)
尝试这样做:
...
else if (String.IsNullOrEmpty(value))
{
try{
throw new Exception("name couldn't be null");
}
catch(Exception ex)
{
//Set Breakpoint Below
int x=0;
}
}
...
您将看到您的代码将进入catch块,并且异常会被抛出。然而,异常的处理取决于您。 Quartermeister已经建议了最好的方法。
否则,根据您的VS IDE设置,异常将被禁止,并且您在屏幕上看不到错误。