Текстовое поле silverlight не обновляется при изменении соответствующего свойства базовой коллекции

Например

У меня есть 2 текстовых поля. Текст обоих текстовых полей привязан к классу Name {String fullname, String funnyName}; Они связаны не напрямую, а через конвертер

Они реализуют INotifyChanged, а граница DataContext равна ObservableCollection и все другие стандартные вещи.

Этот шаблон привязан так, что у меня есть 2 текстовых поля в одной строке, а список имеет 10 строк. Вопрос:

когда я меняю полное имя в текстовом поле 1, я иду и меняю funnyname в связанной коллекции.

Это не сразу отражается на графическом интерфейсе пользователя.

Как я могу этого добиться? Я не хочу обновлять весь список и не хочу напрямую связывать его с другим свойством в моем классе, но через конвертер. Преобразователь не вызывается, когда свойство изменяется с, скажем, «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
}

person pskk    schedule 13.05.2011    source источник


Ответы (2)


Кажется, вы привязываете весь VariableData как значение, а затем используете преобразователь для извлечения нужного вам вывода. Поскольку сам экземпляр VariableData не изменяется (ваш ConvertBack не возвращает новый объект типа VariableData), у пользовательского интерфейса нет причин полагать, что ему необходимо обновить свой пользовательский интерфейс.

Что вам нужно сделать, так это отбросить преобразователь и выполнить привязку к свойствам VariableData, переместить необходимую логику в VariableData создать дополнительные свойства по мере необходимости. Если изменение одного свойства влияет и на другое, вы можете убедиться, что события PropertyChanged вызываются для обоих.

person AnthonyWJones    schedule 14.05.2011

Вы установили Mode=TwoWay в XAML:

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

(в настоящее время нет в среде IDE, поэтому возможны опечатки)

Это будет означать, что пользовательский интерфейс обновляется при MyProperty изменениях, а также MyProperty обновляется при изменении пользовательского интерфейса.

person ChrisF    schedule 13.05.2011
comment
нет ... все еще нет двухсторонней привязки ... скажем, это 10 объектов в моем собрании контекста данных ... и я редактирую свойство объекта строки 1 и нажимаю "Отправить" ... обработчик щелчка идет и обновляет свойства объекта строки 1, а также строку 5 и свойства объекта строки 10 ... я хочу, чтобы графический интерфейс отражал изменения, внесенные в строки 5 и 10 ... и обратите внимание, что все свойства текста привязаны к конвертеру .... - person pskk; 14.05.2011
comment
@pskk - можете ли вы отредактировать свой xaml в свой вопрос (бит, который отображает вашу коллекцию). Я не могу представить себе проблему. - person ChrisF; 14.05.2011