在文本框中没有填充任何内容时,在mvvm WPF中将null设置为property

时间:2011-05-02 08:11:16

标签: wpf mvvm null properties

我实现了一个文本框,这会绑定到一个viewmodel。我填写文本框默认为'100',但如果我将其更改为10,则属性始终设置正确。但是当我删除所有数字时,我希望该属性设置为null。但是当没有填充任何东西时它只是没有设置值。他只保留最后一个值..

这是我的代码,viewmodel + xaml:

public double MaxTime
{
    get
    {
        return maxTime;
    }
    set
    {
        maxTime = value;
        OnPropertyChanged("MaxTime");
        if (SelectedQuestionDropList != null)
        {
            foreach (QuestionCluster cluster in this.Examination.QuestionClusters)
            {
                if (cluster == SelectedQuestionDropList)
                {
                    cluster.MaxTime = value;
                }
            }
        }
    }
}


<TextBox Height="23" 
         Visibility="{Binding Path=VisibleClusterDetails, Converter={StaticResource boolToVis},UpdateSourceTrigger=PropertyChanged}"  
         Text="{Binding Path=MaxTime,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
         HorizontalAlignment="Right" Margin="0,511,601,0" Name="textBox2" 
         VerticalAlignment="Top" Width="120" /> 

3 个答案:

答案 0 :(得分:8)

这是一个绑定问题,你必须做三件事

1)将System命名空间导入xaml文件(注意sys关键字):

xmlns:sys="clr-namespace:System;assembly=mscorlib"

2)然后在你的绑定中你需要告诉它当textbox中的值是string.Empty时发送null(这是文本框中没有任何内容的值,这就是为什么它不起作用的原因,因为string。空无法转换为双倍)。通过这样做:

<TextBox Text={Binding MaxTime,TargetNullValue={x:Static sys:String.Empty}}/>

3)将ViewModel MaxTime属性更改为double?类型

答案 1 :(得分:3)

该属性不能设置为null,因为double不可为空。请尝试使用double?

答案 2 :(得分:2)

您的属性是双精度的,因此它不支持null或空值。

我不会在这里使用double,而是将属性公开为字符串,并在我的属性getter和setter中在string和double之间进行转换。在setter中,我可以根据需要处理null或空值,并且我可以轻松处理所需的任何特殊格式。