如何在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>
    
已邀请:
        您需要在模型上实现implement5ѭ,而不是在ViewModel上实现。 现在,当您尝试验证属性
MyViewModel.NumberTrained
时,您的验证检查将引发错误,该属性不存在,因此永远不会调用验证错误。     
        我觉得在ViewModel上实现
IDataErrorInfo
比在Model上更合适。 因此,在您的情况下,您可以创建一个附加的ViewModel(例如:
MyModelViewModel
),并将其作为ѭ9include包含在
MyViewModel
中,以用作
ItemsSource
。 通过MVVM,如果您觉得应该有一个对应的View,可以将
ItemsControl
中的
DataTemplate
提取到新的XMAL中。     

要回复问题请先登录注册