silverlight文本框在基础集合的相应属性更改时未更新

时间:2011-05-13 20:44:42

标签: c# silverlight binding observablecollection converter

作为一个例子

我有两个文本框。两个文本框的文本都绑定到类Name {String fullname,String funnyName};它们不是直接绑定,而是由转换器

他们正在实施INotifyChanged,并且绑定的DataContextObservableCollection以及所有其他标准内容。

此模板已绑定,因此我在一行中有两个文本框,而列表框有10行 问题是:

当我在文本框1中更改全名时,我去更改绑定集合中的funnyname。

这不会立即反映在GUI上。

我怎样才能做到这一点?我不想更新整个列表框,我不想直接将它绑定到我的类中的另一个属性,而是通过转换器。当属性从“TOm”变为“dick”时,转换器不会被调用,即转换器仅被称为第一次。每当某个属性发生变化时

this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("FunnyName"));
调用

,不调用转换器。

添加了原始代码

集合类

public class VariableData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

String _Source;

    /// <summary>
    /// Gets or sets the source.
    /// </summary>
    /// <value>
    /// The source.
    /// </value>
    public String Source
    {
        get { return _Source; }
        set
        {
            _Source = value; if (this.PropertyChanged != null)
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Source"));
        }
    }
}

绑定

<TextBox Name="textBoxFileLocation"
         Text="{Binding Converter={StaticResource mapTypeToDataConverter}, ConverterParameter=41}"
         Margin="5,5,5,5" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2">
</TextBox>

转换器

public class MapTypeToDataConverter : IValueConverter
{
    #region IValueConverter Members

    /// <summary>
    /// Modifies the source data before passing it to the target for display in the UI.
    /// </summary>
    /// <param name="value">The source data being passed to the target.</param>
    /// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param>
    /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
    /// <param name="culture">The culture of the conversion.</param>
    /// <returns>
    /// The value to be passed to the target dependency property.
    /// </returns>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return "";

        VariableData cus = null;
        try
        {
            cus = (VariableData)value;
        }
        catch (Exception e3)
        {
            return null;
        }
        if (cus == null)
            return "";

        int temp = int.Parse(parameter.ToString());

        int mapType = temp / 10;
        int whatToreturn = temp % 10;

        if (mapType != cus.MappingType)
        {
            if (whatToreturn == 3)
                return false;
            else
                return "";
        }

        switch (whatToreturn)
        {
            case 1:
                return cus.Source;
                break;
            case 2:
                return cus.Query;
                break;
            case 3:
                if (cus.Source != null && cus.Source.Length > 0)
                    return true;
                else
                    return false;
        }

        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value;
    }

    #endregion IValueConverter Members
}

2 个答案:

答案 0 :(得分:1)

您是否在XAML中设置了Mode=TwoWay

<TextBox Text="{Binding MyProperty, Mode=TwoWay, Converter={StaticResource myConverter}}" />

(目前不在IDE,因此可能存在拼写错误)

这意味着当{1}}发生变化时,用户界面会发生变化,而当用户界面发生变化时,会更新MyProperty

答案 1 :(得分:1)

您似乎将整个VariableData绑定为值,然后使用转换器提取所需的输出。由于VariableData实例本身没有变化(您的ConvertBack未返回类型为VariableData的新对象),因此用户界面没有理由相信它需要更新其UI

您应该做的是删除转换器并绑定到VariableData的属性,将您需要的逻辑移动到VariableData中,根据需要创建其他属性。如果更改一个属性也会影响另一个属性,则可以确保为这两个属性引发PropertyChanged个事件。