Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让DataGrid单元格阻止用户输入错误的值?_C#_.net_Wpf_Xaml_Validation - Fatal编程技术网

C# 如何让DataGrid单元格阻止用户输入错误的值?

C# 如何让DataGrid单元格阻止用户输入错误的值?,c#,.net,wpf,xaml,validation,C#,.net,Wpf,Xaml,Validation,我已经关注了这篇文章,虽然它不能阻止用户离开单元格,但我希望让单元格保持焦点。考虑绑定到整型值的单元格,试图输入alpha字符将不允许从单元格中删除焦点。 我的表格如下: <DataGrid HeadersVisibility="Column" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUser

我已经关注了这篇文章,虽然它不能阻止用户离开单元格,但我希望让单元格保持焦点。考虑绑定到整型值的单元格,试图输入alpha字符将不允许从单元格中删除焦点。

我的表格如下:

<DataGrid HeadersVisibility="Column"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          CanUserDeleteRows="False"
          CanUserResizeRows="False"
          ItemsSource="{Binding SelectedLines}">
    <DataGrid.RowValidationRules>
        <ExceptionValidationRule />
    </DataGrid.RowValidationRules>
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn IsReadOnly="False" Header="Qty"
                            Binding="{Binding Quantity, ValidatesOnExceptions=True}"/>
    </DataGrid.Columns>
</DataGrid>
无论我做什么,网格都不会显示有错误,即单元格周围没有红色框,我希望阻止用户离开焦点。如果我在单元格中输入“x”,它的行为正确,但如果我输入-1,它不会提交值,因为网格不允许我尝试编辑另一行,按原始单元格上的
Escape
将其正确还原


我还想知道网格是否公开了一个属性,表明它存在错误,通过这种方式我可以绑定任何验证,例如未启用“接受”按钮。

在您的特殊情况下,您的datagrid没有机会说有错误,因为底层数据没有被发现有错误

例如,当您绑定到int类型的VM属性并在ui中将该值设置为xyz时,唯一会引发bindingexception,但xyz永远不会落到您的VM上

这是mvvm和wpf中的一个常见问题。大多数时候,我在viewmodels中使用字符串和IDataErrorInfo接口,在UI中使用屏蔽textboxen进行输入。这样做的好处是我可以处理vm IDataErrorInterface中的每个输入。但我还有一些工作要做,以便将字符串映射到我的模型的正确类型(例如vm中的字符串到模型中的int)

如果在调试时查看输出窗口,您应该会看到bindingexception

我知道这不是一个真正的答案

public class MyEntry : INotifyPropertyChanged /*, IEditableObject*/ {
    public MyEntry(string name) {
        this.Name = name;
        this.Quantity = 1;
    }
    public string Name {
        get;
        private set;
    }
    private int quantity;
    public int Quantity {
        get { return quantity; }
        set {
            if (quantity != value) {
                if (value < 1)
                    throw new ArgumentException("Quantity may not be less than 1.");
                if (value > 100)
                    throw new ArgumentException("Quantity may not be more than 100.");
                quantity = value;

                OnPropertyChanged("Quantity");
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    #region IEditableObject Members
    private int backupQuantity;
    private bool inEdit;
    public void BeginEdit() {
        if (inEdit) return;
        inEdit = true;
        backupQuantity = this.Quantity;
    }
    public void CancelEdit() {
        if (!inEdit) return;
        inEdit = false;
        this.Quantity = backupQuantity;
    }
    public void EndEdit() {
        if (!inEdit) return;
        inEdit = false;
        backupQuantity = 0;
    }
    #endregion
}