Привязка к WPF очень медленная, когда происходят исключения преобразования - PullRequest
0 голосов
/ 27 мая 2018

У меня есть текстовое поле, связанное с двойным свойством в окне, с UpdateSourceTrigger, установленным на PropertyChanged.Ввод текста заметно медленный, когда содержимое текстового поля не является допустимым числом.Это немного быстрее при запуске исполняемого файла прямо за пределами Visual Studio.Странно, но на моем офисном компьютере это работает намного быстрее, хотя у них похожие характеристики.

Это медленные ответы вызывают исключения преобразования (которые я вижу в журнале в окне вывода)?Я знаю, что исключения могут замедлить программу, но, конечно, не так сильно.Я ожидаю, что код привязки перехватывает исключение довольно близко к тому месту, где оно генерируется, поэтому стеку не нужно будет слишком много уровней разматывать.Должен ли я как-то предотвратить возникновение исключения?Если это так, я могу придумать несколько способов сделать это.

  1. Привязать текстовое поле к строковому свойству
  2. Реализовать пользовательский конвертер, который преобразуется в значение «по умолчанию»,скажи сделать мою собственность двойной?и установите его в null, если значение не может быть проанализировано.

Есть ли лучший способ?

Вот минимальный пример, который показывает используемую мной привязку.

<Window x:Class="WpfApp5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp5"
        mc:Ignorable="d"
        x:Name="_window" Title="MainWindow" Height="176.351" Width="404.73">
    <Grid Margin="0,0,0,0">
        <TextBox HorizontalAlignment="Left" Height="22" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="73"
                 Text="{Binding Quantity, ElementName=_window, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, StringFormat='{}{0:#,0}'}"/>
    </Grid>
</Window>

public partial class MainWindow : Window
{
    public double Quantity { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }
}

1 Ответ

0 голосов
/ 27 мая 2018

Нечто подобное может сработать для вас.

private double quantity;
public string Quantity
{
    get { return quantity.ToString(); } // , StringFormat='{}{0:#,0}'
    set
    {
        if(quantity.ToString() != value)
        {
            if (string.IsNullOrEmpty(value))
            {
                quantity = 0;
                NotifyPropertyChanged("Quantity");
            }
            else
            {
                double temp;
                if (double.TryParse(value, out temp))
                {
                    quantity = temp;
                    NotifyPropertyChanged("Quantity");
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...