首页 > 解决方案 > 控件未命中设置的属性 wpf mvvm

问题描述

我有一个与文本框(WPF)绑定的双类型​​属性。当我用空文本框失去焦点时,控件没有击中 set 属性。如果我给出一个像 10.2 这样的有效输入,那么它会达到 viewmodel 的 set 属性。即使有无效数据,是否有任何解决方案来控制 set 属性?

设置.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");
            }
        }

标签: wpfmvvm

解决方案


你有一些方法来处理这个问题(顺便说一句,你在 wpf 中得到一个强制转换异常,这就是你的属性设置器没有被命中的原因)。

  1. 在一个完美的 mvvm 世界中,您可以将所有类型的属性设置为字符串,并且您的绑定将起作用,并且您也可以轻松地进行错误验证。这样做的缺点 - 您现在必须将您的属性转换为正确的类型,只要您的值进入模型。
  2. 在您的特殊情况下,您可以使用Nullable Double。但是如果有人在你的 TextBox 中放了一些字母,你又会遇到同样的问题。你的二传手不会击中。您可以使用行为或数字文本框来处理此问题。

推荐阅读