Элемент управления не соответствует установленному свойству wpf mvvm - PullRequest
0 голосов
/ 02 марта 2020

У меня есть свойство типа double, которое связано с текстовым полем (WPF). Когда я потерял фокус с пустым текстовым полем, элемент управления не попадает в заданное свойство. Если я даю корректный ввод, например 10.2, то он попадает в свойство set viewmodel. Есть ли какое-либо решение, чтобы поразить управление над установленным свойством, даже если есть недопустимые данные?

Settings.xaml

<StackPanel Orientation="Horizontal" Margin="10,0,0,10" Height="20">
                    <TextBlock Text="Minimum Peak Ratio:" Width="145"></TextBlock>
                    <TextBox Text="{Binding SkylineMinPeakRatio,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Style="{StaticResource InputStyle}">
                        <i:Interaction.Behaviors>
                            <Behaviors:TextBoxInputBehavior InputMode="DecimalInput"/>
                        </i:Interaction.Behaviors>
                    </TextBox>
                    <Button x:Name="MinPeakRatioError" Margin="5,0,0,0" Visibility="{Binding MinPeakRatioInfoVisibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                        <Image Source="..\Images\ErrorInfo.jpg"></Image>
                        <Button.ToolTip>
                            <ToolTip>
                                <StackPanel>
                                    <TextBlock FontWeight="Bold" Text="{Binding MinPeakRatioErrMsg}"></TextBlock>
                                    <TextBlock Text="{Binding MinPeakRatioErrMsgDescription}"></TextBlock>
                                </StackPanel>
                            </ToolTip>
                        </Button.ToolTip>
                    </Button>
                </StackPanel>

SettingsViewModel.cs

private double skylineMinPeakRatio

   public double SkylineMinPeakRatio
        {
            get
            {
                return skylineMinPeakRatio;
            }
            set
            {
                skylineMinPeakRatio=value;
                OnPropertyChanged("SkylineMinPeakRatio");
            }
        }

1 Ответ

1 голос
/ 03 марта 2020

У вас есть несколько способов справиться с этой проблемой (кстати, вы получаете исключение приведения в wpf и поэтому ваш установщик свойств не поражен).

  1. В идеальном мире mvvm вы можете сделать все свои свойства типа string и ваши привязки будут работать, и вы также можете легко выполнить проверку ошибок. Недостаток этого - теперь вам нужно преобразовать ваши свойства в правильный тип, насколько ваше значение соответствует модели.
  2. в вашем особом случае вы можете использовать Nullable Double . но если кто-то вставит несколько букв в ваш TextBox, у вас снова возникнет та же проблема. Ваш Сеттер не будет поражен. Вы можете справиться с этим с помощью поведения или числа c TextBox.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...