我有一个文本框绑定到具有类型Timespan属性的类,并编写了一个值转换器将字符串转换为TimeSpan.
如果在文本框中输入非数字,我希望显示自定义错误消息(而不是默认的"输入字符串格式错误").
转换器代码是:
public object ConvertBack(
object value,
Type targetType,
object parameter,
CultureInfo culture)
{
try
{
int minutes = System.Convert.ToInt32(value);
return new TimeSpan(0, minutes, 0);
}
catch
{
throw new FormatException("Please enter a number");
}
}
Run Code Online (Sandbox Code Playgroud)
我在XAML绑定中设置了'ValidatesOnExceptions = True'.
但是,我遇到了以下MSDN文章,它解释了为什么以上内容不起作用:
"数据绑定引擎不会捕获由用户提供的转换器抛出的异常.Rinit方法抛出的任何异常,或者Convert方法调用的方法抛出的任何未捕获的异常都被视为运行时错误"
我已经读过'ValidatesOnExceptions确实捕获TypeConverters中的异常,所以我的具体问题是:
我有.Net framework v4.0.30319 SP1Rel和visual studio 2010 v 10.0.40219.1 SP1Rel(取自VS中的about对话框的数据).
.Net 4.0可以在http://referencesource.microsoft.com/netframework.aspx上找到,但不确定是哪个特定版本,以及它是否与我的设置兼容.我确实下载了一两个月的源代码,但我无法进入框架源(没有源可用消息).我当时读过,似乎是由于VS的更新(可能是已安装的框架二进制文件)取代了源版本.
在我再次尝试下载之前,有人可以确认源是否符合最新版本并与之兼容.如果没有,是否有替代(可能是第三方)工具允许踩到源?
编辑:好的,刚看到这个http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/thread/41388c7b-582b-4e3f-8178-3d38a3c99639,这表明你不能使用当前的源代码?
有些像这样的xaml:
<Grid Name="grid">
<AdornerDecorator>
<TextBox Height="23" HorizontalAlignment="Left" Name="textBox1" Width="120" />
</AdornerDecorator>
</Grid>
Run Code Online (Sandbox Code Playgroud)
WPF Snoop实用程序指示textBox1是AdornerDecorator的子项(正如您所期望的那样),但AdornerDecorator创建的AdornerLayer也是子项.由于添加到AdornerLayer的自定义装饰器可以显示在文本框的"外部",因此AdornerLayer的绘图表面也必须伸展到外面(大概是整个窗口).
那么,AdornerDecorator的位置具有什么真正的意义(假设我们将UI元素绑定到我们放置在AdornerLayer中的自定义装饰器)?我知道AdornerLayer.GetAdorner(textBox1)将从textbox1获取可视树中的第一个装饰层,但是它在哪里(因为自定义ardorner被添加到图层而自定义ardoner知道它绑定了哪个元素)至)?
文章http://msdn.microsoft.com/en-us/magazine/dd419663.aspx具有以下代码示例:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是通过引入变量'handler'获得了什么 - 以下代码似乎工作正常:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged!= null)
{
var e = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, e);
}
}
Run Code Online (Sandbox Code Playgroud) 使用以下代码,虽然Text属性绑定到DateTime源属性,但我注意到WPF似乎自动将文本转换为DateTime,而不需要编写ValueConverter.有人可以说明这是如何完成的
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525"
>
<StackPanel>
<DatePicker Height="25" Name="datePicker1" Width="213" Text="{Binding Path=DueDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
public class P
{
private DateTime? dueDate = DateTime.Now;
public DateTime? DueDate
{
get { return dueDate; }
set
{
dueDate = value;
}
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
P p = new P();
this.DataContext = p;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个WpfApplication项目(Visual Studio 2008),其中通过在Settings.settings文件中输入'Name'和'Value'对生成app.config(因此生成'applicationSettings'元素而不是'appSettings'元素).
我在同一个Visual Studio解决方案中添加了一个class1类库项目.
**我已经使用"添加现有项目然后添加为链接"将WpfApplication app.config文件添加到class1项目.**因为发现这是不必要的(即字符串a = ConfigurationManager.AppSettings.Get("key1") ;下面没有这个工作)
我想从class1中读取app.config中的值,并探讨了以下内容:
string s1 = Settings.Default.appsetting1;
Run Code Online (Sandbox Code Playgroud)
但我不想从Class 1项目引用WpfApplication10项目,因此无法获得对Settings类的引用.因此,此语法仅适用于WPF项目.
string a = ConfigurationManager.AppSettings.Get("key1").ToString();
Run Code Online (Sandbox Code Playgroud)
这确实有效,但前提是我将以下内容添加到app.config:
<appSettings>
<add key="key1" value="1"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以实现我想要的更好的方法(例如提供类型安全性或能够读取Settings类属性?