【发布时间】:2011-10-10 23:32:37
【问题描述】:
我正在尝试获取在 DataGrid 中验证的 ViewModel 的属性,但我遇到了问题。
我的 XAML 代码如下所示:
<DataGrid x:Name="Items">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" />
</DataGrid.Columns>
</DataGrid>
Items-collection(基于 Caliburn.Micro Screen-class)中的 ViewModel-objects 具有如下所示的属性:
public int Quantity
{
get { return Section.Quantity; }
set { Section.Quantity = value; }
}
这很好用!如果我在应该是数量的单元格中输入“abc”,则会在文本框周围画一条红线以指示错误。
但是我希望能够稍微操纵 Quantity 值,所以我想改用这段代码:
public string Quantity
{
get { return string.Format("{0} pcs.", Section.Quantity); }
set
{
var quantityAsText = value.Replace("pcs.", string.Empty).Trim();
int quantity;
if (int.TryParse(quantityAsText, out quantity))
{
Section.Quantity = quantity;
NotifyOfPropertyChange(() => Quantity);
}
else
{
throw new FormatException("Quantity must be a number!");
}
}
}
但是这不起作用。 FormatException 永远不会被捕获,我的应用程序崩溃了......
我尝试修改绑定到 this 没有任何积极的结果:
Binding="{Binding Quantity, Mode=TwoWay, ValidatesOnExceptions=True}"
有什么想法吗?
【问题讨论】:
-
我要么使用转换器来处理这种事情,要么干脆放弃它。您愿意花多少精力来担心尝试输入“pcs”的人?
-
我的例子被大大简化了,所以它不仅仅是“pcs”。我担心的文字,我——事后看来——也许应该说清楚。我只是创建了这个例子来保持简单。
-
好吧,无论如何,这就是转换器的用途。 UIElement 的“属性”窗口中也有类似的情况。您有一个 Width 和 Height 属性。它们采用代表像素的双精度值,但在属性编辑器中,您可以输入以英寸(11 英寸)为单位的尺寸,该尺寸将转换为像素。
-
@Will:我猜你对转换器的预期用途是正确的。在我的真实代码中,我必须验证一堆其他属性,所以我必须创建多个 ValueConverters 和 MultiValueConverters,这就是我想要避免的。此外,在 MVVM 情况下,我希望在 View 的 ViewModel 上进行验证,将放置转换器。
标签: wpf validation mvvm datagrid caliburn.micro