如何在ItemsControl内的TextBox上使用ValidatesOnDataErrors
||
我正在尝试使用IDataErrorInfo验证TextBox的内容。下面列表的来源是一个列表,并显示每个项目。当我在“文本框”上的“文本绑定”中输入“ 0”时,它无法正常工作。我该怎么做呢?
<ItemsControl ItemsSource=\"{Binding Trainings}\">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<StackPanel>
<TextBlock Text=\"{Binding MobileOperator}\" />
<TextBlock Text=\"{Binding LastUpdate}\"/>
</StackPanel>
<StackPanel>
<TextBlock Text=\"Number trained*\" />
<!-- ValidatesOnDataErrors doesn\'t work here-->
<TextBox
Text=\"{Binding NumberTrained,
ValidatesOnDataErrors=True}\"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
更新:发布简化的Model,ViewModel,View和CodeBehind版本
ViewModel和模型
public class MyViewModel : IDataErrorInfo, INotifyPropertyChanged
{
public MyViewModel()
{
Trainings = new List<MyModel>
{
new MyModel { NumberTrained = 5, MobileOperator = \"MO 1\", LastUpdate = DateTime.Now },
new MyModel { NumberTrained = 1, MobileOperator = \"MO 2\", LastUpdate = DateTime.Now },
};
OkButtonCommand = new ButtonCommand(OnClick);
}
private void OnClick()
{
PropertyChanged(this, new PropertyChangedEventArgs(\"\"));
}
public event PropertyChangedEventHandler PropertyChanged;
public ICommand OkButtonCommand { get; private set; }
public List<MyModel> Trainings { get; private set; }
public string Error { get { return null; } }
public string this[string columnName]
{
get
{
string error = null;
switch (columnName)
{
case \"NumberTrained\":
error = \"error from IDataErrorInfo\";
break;
}
return error;
}
}
}
public class MyModel
{
public string MobileOperator { get; set; }
public DateTime LastUpdate { get; set; }
public int NumberTrained { get; set; }
}
public class ButtonCommand : ICommand
{
private Action _handler;
public event EventHandler CanExecuteChanged;
public ButtonCommand(Action handler) { _handler = handler; }
public bool CanExecute(object parameter) { return true; }
public void Execute(object parameter) { _handler(); }
}
背后的代码
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
DataContext = new MyViewModel();
}
}
视图
<Canvas x:Name=\"LayoutRoot\" Background=\"White\">
<ItemsControl ItemsSource=\"{Binding Trainings}\">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel HorizontalAlignment=\"Center\">
<StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\">
<TextBlock Text=\"{Binding MobileOperator}\" Margin=\"15,15,0,0\" FontWeight=\"Bold\"/>
<TextBlock Text=\"{Binding LastUpdate, StringFormat=\' - Last Updated: \\{0:M/d/yy\\}\'}\"
Margin=\"5,15,15,0\" Foreground=\"Gray\"/>
</StackPanel>
<StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\">
<TextBlock Text=\"Number trained*\" />
<TextBox Width=\"50\" Height=\"20\"
Text=\"{Binding NumberTrained, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}\"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content=\"ok\" Width=\"100\" Height=\"20\" Canvas.Left=\"248\" Canvas.Top=\"207\" Command=\"{Binding OkButtonCommand}\"/>
</Canvas>
没有找到相关结果
已邀请:
2 个回复
锹缄
时,您的验证检查将引发错误,该属性不存在,因此永远不会调用验证错误。
厦惫
比在Model上更合适。 因此,在您的情况下,您可以创建一个附加的ViewModel(例如:
),并将其作为ѭ9include包含在
中,以用作
。 通过MVVM,如果您觉得应该有一个对应的View,可以将
中的
提取到新的XMAL中。