проблема с привязкой десятичного значения в сетке данных wpf - PullRequest
0 голосов
/ 09 июля 2010

Еще один вопрос wpf.

У меня есть два DataGridTextColumn, которые принимают десятичные значения. по какой-то причине, когда я добавляю новую строку (начальное значение столбцов равно нулю), я должен ввести свое значение дважды в любой из этих двух столбцов. Когда я в первый раз набираю значение и выхожу, значение возвращается к нулю. После ввода значения во второй раз оно остается.

<DataGridTextColumn Header="Unit Price" EditingElementStyle="{StaticResource CellEditStyle}" Width="SizeToCells" MinWidth="90" Binding="{Binding ItemUnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<DataGridTextColumn Header="Qty" EditingElementStyle="{StaticResource CellEditStyle}" Width="SizeToCells" MinWidth="65" Binding="{Binding ItemQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />

ДГ связан с наблюдаемой коллекцией в моей виртуальной машине. Я не уверен, что это как-то связано с этим, но я добавил событие endit в свой OC, создав отдельный класс (используется для сохранения данных, когда пользователи покидают строку):

public class ObservableProjectExpenseItems : ObservableCollection<ProjectExpenseItemsBO>
{
    protected override void InsertItem(int index, ProjectExpenseItemsBO item)
    {
        base.InsertItem(index, item);
        item.ItemEndEdit += new ProjectExpenseItemsBO.ItemEndEditEventHandler((x) =>
        {
            if (ItemEndEdit != null)
                ItemEndEdit(x);
        });
    }

    public event ProjectExpenseItemsBO.ItemEndEditEventHandler ItemEndEdit;
}

Мой бизнес-объект выглядит так:

public class ProjectExpenseItemsBO : IDataErrorInfo, IEditableObject
{
    public int RowID { get; set; }
    public int ProjectExpenseID { get; set; }
    public string ItemNumber { get; set; }
    public string ItemDescription { get; set; }
    public decimal ItemUnitPrice { get; set; }
    public decimal ItemQty { get; set; }
    public string SupplierName { get; set; }
    public DateTime CreateDate { get; set; }

    public ProjectExpenseItemsBO()
    {

    }
   // string method
    static bool IsStringMissing(string value)
    {
        return String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
    }

    private bool _isValid = true;
    public bool IsValid 
    {
        get { return _isValid; }
        set { _isValid = value; }
    }

    #region IDataErrorInfo Members

    public string Error
    {
        get
        {
            return this[string.Empty];
        }
    }

    public string this[string propertyName]
    {
        get
        {
            string result = string.Empty;
            if (propertyName == "ProjectExpenseID")
            {
                if (this.ProjectExpenseID == 0)
                    result = "An existing project expense item must be selected!";
            }

            if (propertyName == "ItemNumber")
            {
                if (this.ItemNumber != null)
                {
                    if (IsStringMissing(this.ItemNumber))
                        result = "Item number cannot be empty!";
                    if (this.ItemNumber.Length > 50)
                        result = "Item number cannot be longer than 50 characters!";
                }
            }

            if (propertyName == "ItemDescription")
            {
                if (this.ItemDescription != null)
                {
                    if (this.ItemDescription.Length > 256)
                        result = "Item description cannot be longer than 256 characters!";
                }
            }

            if (propertyName == "ItemUnitPrice")
            {
                if (this.ItemUnitPrice == 0.0M)
                    result = "Item unit price cannot be empty!";
            }

            if (propertyName == "ItemQty")
            {
                if (this.ItemQty == 0.0M)
                    result = "Item quantity cannot be empty!";
            }

            if (propertyName == "SupplierName")
            {
                if (this.SupplierName != null)
                {
                    if (this.SupplierName.Length > 128)
                        result = "Item number cannot be longer than 128 characters!";
                }
            }

            if (result.Length > 0)
                IsValid = false;
            else
                IsValid = true;

            return result;
        }
    }

    #endregion

    #region IEditableObject Members

    public delegate void ItemEndEditEventHandler(IEditableObject sender);

    public event ItemEndEditEventHandler ItemEndEdit;

    public void BeginEdit()
    {
        //throw new NotImplementedException();
    }

    public void CancelEdit()
    {
        //throw new NotImplementedException();
    }

    public void EndEdit()
    {
        if (ItemEndEdit != null)
        {
            ItemEndEdit(this);
        }
    }

    #endregion
}

}

1 Ответ

0 голосов
/ 16 июля 2010

Технически это не является ответом, но я обнаружил, что проблема заключалась в следующем:

        if (propertyName == "ItemQty") 
        { 
            if (this.ItemQty == 0.0M) 
                result = "Item quantity cannot be empty!"; 
        }

Это всегда приведет к ошибке в новой строке, поскольку столбец dg имеет значение по умолчанию, равное нулю.Как только я избавился от этой проверки, проблема исчезла.

Однако у меня также есть проблема с обязательным полем.Процесс проверки (IDataError) запускается, как только вы вводите новую строку.Очевидно, что большинство проверок не удастся, потому что вы еще не ввели данные.Однако, когда вы вводите начальное значение, даже если оно допустимо, оно очищается.Я не думаю, что это правильное поведение, и мне было интересно, есть ли способ отключить начальную проверку, пока пользователь не покинет строку таблицы данных.Кроме этого, я не уверен, почему это будет очищено.Это происходит только при вводе начального значения.После того, как вы перейдете на вкладку и вернетесь назад, вы можете ввести значение, и оно останется действительным или нет.Если значение недопустимо, стиль проверки помечает недопустимый столбец как следует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...