Свойство зависимости для ValueConverter или повторное управление?

У меня есть настраиваемый элемент управления с некоторым текстом в шаблоне содержимого:

<ControlTemplate TargetType="{x:Type local:TouchScreenKey}">    
    <TextBlock><ContentPresenter Content="{TemplateBinding Title, Converter={StaticResource CaseConverter}}" /></TextBlock>
</ControlTemplate>

и пользовательский IValueConverter CaseConverter — со свойством UpperCase. Таким образом, когда для свойства UpperCase преобразователя установлено значение true, он преобразует текст в верхний регистр при привязке. Все пойдет нормально, если я изменю UpperCase в разметке. Но если я изменю свойство во время выполнения - ничего не произойдет, потому что изменение свойства преобразователя не заставит мой элемент управления перепривязываться. Как я могу переназначить элемент управления, который использует преобразователь при изменении свойства преобразователя?


person alek.sys    schedule 26.02.2010    source источник


Ответы (2)


Насколько я знаю, нет способа заставить конвертер обновить все цели. Преобразователь ничего не знает о целях. Это просто функция без сохранения состояния, F(x), принимает одно значение и возвращает другое.

Чтобы обновить свойство, вы должны попросить WPF сделать это. Например, если свойство привязано к некоторому исходному свойству, вы можете реализовать INotifyPropertyChanged и вызвать событие PropertyChanged. Или вы можете попросить BindingOperations получить выражение привязки и вызовите UpdateTarget()< /а> вручную.

Может конвертер здесь не лучший выбор? Вы также можете рассмотреть возможность использования прикрепленных свойств для изменения регистра символов.

person Anvaka    schedule 26.02.2010
comment
Спасибо за ответ, я решил это с помощью Multibinding и MultiValueConverter. - person alek.sys; 26.02.2010
comment
Пожалуйста :). Я рад, что ты смог найти ответ сам. Ваше здоровье - person Anvaka; 26.02.2010

Это может помочь кому-то - я нашел решение - используя мультибиндинг

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
<ContentPresenter>
    <ContentPresenter.Content>
        <MultiBinding Converter="{StaticResource MultiCaseConverter}">
            <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Title" />
            <Binding ElementName="TouchKeyboard" Path="UpperCase" />
        </MultiBinding>
    </ContentPresenter.Content>
</ContentPresenter>

and wrote MultiCaseConverter - which convert first parameter depending from second (UpperCase)

person alek.sys    schedule 26.02.2010