Изменения, сделанные в Конвертере, сообщат об изменении в связанном свойстве? - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть два свойства FirstName и LastName, которые привязаны к текстовому блоку с помощью Multibinidng и конвертера для отображения FullName как FirstName + Last Name.

FirstName = "Кишор" LastName = "Кумар"

В Конвертере я изменил Фамилию как «Измененный текст»

values[1] = "Changed Text";

После выполнения конвертера в моем TextBlock будет отображаться «Kishore Changed Text», но свойство Dependency LastName по-прежнему будет иметь последнее значение «Kumar». Почему я не получаю значение «Измененный текст» в свойстве LastName после выполнения?

Будет ли изменение, внесенное в конвертере, уведомлять связанное свойство?

 <Window.Resources>
    <local:NameConverter x:Key="NameConverter"></local:NameConverter>
</Window.Resources>
<Grid>
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource NameConverter}">
                <Binding Path="FirstName"></Binding>
                <Binding Path="LastName"></Binding>
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
 </Grid>

Преобразователь:

 public class NameConverter:IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        values[1] = "Changed Text";
        return values[0].ToString() + " " + values[1].ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2010

Будет ли изменение, внесенное в конвертере, уведомлять связанное свойство?Конвертеры используются для преобразования связанных значений, а не их изменения.Это следует делать в более подходящем месте, например, при принудительном применении свойства зависимости или в модели представления.

0 голосов
/ 22 декабря 2010

Объект [], полученный в качестве параметра в методе Convert, является значением свойства после оценки двух привязок. Значения свойств были скопированы в массив, и, присваивая значения элементам, вы изменяете только массив, а не свойства, из которых получены значения.

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

public class NameConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Person p = value as Person;
        if (p == null) { return null; }
        p.LastName = "Changed Text";
        return p.FirstName + " " + p.LastName;
    }
// ...
}

Конечно, тогда не будет необходимости в MultiBinding. Вы можете просто привязать к самому объекту:

<TextBlock Text="{Binding Converter={StaticResource NameConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...