WPF: ErrorMessage при попытке привязать строку к двум элементам UIE - PullRequest
1 голос
/ 16 февраля 2011

Я пытаюсь связать строку с двумя ScatterViewItems:

private void BindLineToScatterViewItems(Shape line, ScatterViewItem origin, ScatterViewItem destination)
        {
            // Bind line.(X1,Y1) to origin.ActualCenter
            BindingOperations.SetBinding(line, Line.X1Property, new Binding { Source = origin, Path = new PropertyPath("ActualCenter.X") });
            BindingOperations.SetBinding(line, Line.Y1Property, new Binding { Source = origin, Path = new PropertyPath("ActualCenter.Y") });

            // Bind line.(X2,Y2) to destination.ActualCenter
            BindingOperations.SetBinding(line, Line.X2Property, new Binding { Source = destination, Path = new PropertyPath("ActualCenter.X") });
            BindingOperations.SetBinding(line, Line.Y2Property, new Binding { Source = destination, Path = new PropertyPath("ActualCenter.Y") });
        }

Но я всегда получаю следующее сообщение об ошибке:

System.Windows.Data Ошибка: 5: значениесозданный BindingExpression недействителен для целевого свойства .;Значение = 'NaN' BindingExpression: Path = ActualCenter.X;DataItem = 'ScatterViewItem' (Name = '');целевой элемент - «Линия» (Name = '');Свойство target - 'X1' (тип 'Double')

Тем не менее, оно работает, но как я могу подавить это предупреждение?И почему отображается это предупреждение?

РЕДАКТИРОВАТЬ: В соответствии с ответом ниже, я сейчас использую следующий конвертер, но все еще получаю ошибки:

public class NormalizationConverter : IValueConverter

    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
           return (double) value == double.NaN ? Binding.DoNothing : (double) value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

1 Ответ

2 голосов
/ 16 февраля 2011

У меня нет Surface, но, очевидно, ActualCenter.X и ActualCenter.Y начинаются как double.NaN, прежде чем им будут присвоены их фактические значения. Поскольку это не длится долго, вы можете использовать любое другое двойное значение. Поэтому, чтобы избежать предупреждения, вы можете использовать конвертер, который переводит double.NaN в O:

public class NormalizationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var doubleValue = (double)value;
        return doubleValue == double.NaN ? 0 : doubleValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...