清除UI上的文本框时,转换器不会触发

时间:2018-10-12 10:11:19

标签: wpf xaml

当我添加值或在文本框中更改它时,转换器每次都会触发。当我删除/清除值时,转换器永远不会触发。在保存空文件之后,它实际上还保存了以前的值。

<TextBox Text="{Binding FemaleCT, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="NumberValidationTextBox" VerticalContentAlignment="Center" TextAlignment="Center" Width="100">
      <TextBox.Background>
          <MultiBinding Converter="{StaticResource inToleranceHighlightsConverter}">
               <Binding Path="FemaleCT"></Binding>
               <Binding ElementName="MF" Path="Text"></Binding> 
               <Binding ElementName="MF_LowTolerance" Path="Text"></Binding>
               <Binding ElementName="MF_HighTolerance" Path="Text"></Binding>
               <Binding ElementName="SampleEnabled" Path="Text"></Binding>
          </MultiBinding>
    </TextBox.Background>
</TextBox>

这可能很重要,数据值FemaleCT是可为空的十进制,并且是ObservableCollection的一部分。

public ObservableCollection<MouldCTModel> ctMeasurements
    {
        get { return _ctMeasurements; }
        set { _ctMeasurements = value; this.RaisePropertyChanged(nameof(ctMeasurements)); CanSignScreen(); }
    }

这是正常行为还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的问题是将十进制数绑定到字符串属性。 string.empty无法转换为十进制,因此绑定失败并且该属性不会更新。由于该属性不变,因此不会触发转换器,并且该对象仍具有其旧值。

我发现最好将数字,日期等包装在字符串中:

    private string femaleCT;

    public string FemaleCT
    {
        get
        {
            return this.femaleCT;
        }

        set
        {
            this.femaleCT = value;

            decimal temp;
            if (decimal.TryParse(value, out temp))
            {
                this.model.FemaleCT = temp;
            }

            this.NotifyPropertyChanged();
        }
    }

然后编写转换器以获取一个字符串,当字符串为空或无效值时,它可以决定该怎么做。

此方法还允许您验证字符串值。验证模型还不够,因为只有在值是有效数字时才会更新模型。