WPF绑定与int类型的属性无法正常工作

时间:2009-07-29 09:58:46

标签: c# wpf silverlight xaml data-binding

我的视图模型中有int类型的属性绑定到TextBox。一切正常,TwoWay绑定工作正常,除了一个案例 -

如果我清除TextBox的值,则不会调用属性设置器,尽管在TextBox中清除了值,但属性仍保留以前的值。

有没有人遇到过类似的问题?对此有什么解决方法吗?

这是属性 -

public int MaxOccurrences
{
    get
    {
        return this.maxOccurrences;
    }
    set
    {
        if (this.maxOccurrences != value)
        {
            this.maxOccurrences = value;
            base.RaisePropertyChanged("MaxOccurrences");
        }
    }
}

以下是我在xaml中绑定属性的方法 -

<TextBox Text="{Binding Path=MaxOccurrences, Mode=TwoWay, 
    NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
    HorizontalAlignment="Center" Width="30" Margin="0,0,5,0"/>

6 个答案:

答案 0 :(得分:25)

我遇到了类似的问题。

您只需将代码更新为:

<TextBox Text="{Binding Path=MaxOccurrences, Mode=TwoWay, TargetNullValue={x:Static sys:String.Empty},
NotifyOnSourceUpdated=True,  UpdateSourceTrigger=PropertyChanged}"  
HorizontalAlignment="Center" Width="30" Margin="0,0,5,0"/> 

答案 1 :(得分:6)

这部分是猜测(我现在还没有得到VS方便试用),但我认为这是因为清除的文本框是空的string""),无法隐式转换为int。您可能应该实现类型转换器来为您提供转换。 (你可能想要做一些像转换“”到0)

答案 2 :(得分:6)

如果您不想使用Nullable integer,可以使用converter将空string转换为0,请参阅以下代码:< / p>

public class EmptyStringToZeroConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null || string.IsNullOrEmpty(value.ToString())
            ? 0
            : value;
    }

    #endregion
}

答案 3 :(得分:1)

Akjoshi,我有一个有效的解决方案!

您需要将整数属性更改为Naullable<int>(即int?),请参阅以下代码段:

private int? _maxOccurrences;
public int? MaxOccurrences
{
    get { return _maxOccurrences; }
    set { _maxOccurrences = value; }
}

您还需要添加值转换器以将空字符串转换为空值,请参阅以下代码段:

public class EmptyStringToNullConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null || string.IsNullOrEmpty(value.ToString())
            ? null
            : value;
    }

    #endregion
}

XAML代码:

<Window x:Class="ProgGridSelection.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:ProgGridSelection"
    Title="MainWindow"
    Height="136" Width="525"
    Loaded="OnWindowLoaded">
<Window.Resources>
    <local:EmptyStringToNullConverter x:Key="EmptyStringToNullConverter"/>
</Window.Resources>
<StackPanel>
    <Button Content="Using Empty String to Null Converter"/>
    <TextBox Name="empNameTextBox"
             Text="{Binding Mode=TwoWay, Path=MaxOccurrences,
                RelativeSource={RelativeSource FindAncestor, AncestorType=Window},
                Converter={StaticResource EmptyStringToNullConverter}}"/>
</StackPanel>

[注意:这只是一个概念证明,为了简单起见,我没有使用任何模式或最佳实践]

答案 4 :(得分:0)

这是因为int值不能是null。 最好使用string属性将代码中的值转换为所需的int属性字段。

这样你就可以执行

if(string.IsNullOrEmpty(text))
{
  this.intValue = 0;
}

答案 5 :(得分:0)

我有同样的问题,但我需要处理而不是数值。我使用以下转换器:

public class StringFormatToIntConverter : IValueConverter
{            
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
          return value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
       if(value is string)
       {
           var inttext = 
            System.Text.RegularExpressions.Regex.Replace((string)value, "[^.0-9]", "");

           int number;
           return Int32.TryParse(inttext, out  number) ? number : 0;
       }
       else
       {
           return value;
       }
    }
}