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

В качестве примера

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

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

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

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

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

Как мне этого добиться?Я не хочу обновлять весь список и не хочу напрямую связывать его с другим свойством в моем классе, но через конвертер.Конвертер не вызывается, когда свойство изменяется с «TOm» на «член», т. Е. Конвертер вызывается только в первый раз.Затем, когда изменяется какое-либо свойство и вызывается

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 ]

1 голос
/ 14 мая 2011

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

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

1 голос
/ 14 мая 2011

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

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

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

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

...