2009-09-12 1 views
8

У меня есть приложение WPF, в котором пытались реализовать шаблон MVVM и Prism 2. У меня есть Usercontrol, который подписался на событие, запущенное из другого Usercontrol. Я хотел бы переключить видимость нескольких дочерних элементов в подписном элементе управления. События срабатывают должным образом, даже я успешно могу привязывать данные к некоторым элементам. Как связать видимость или любое свойство стиля в этом отношении с ViewModel и динамически изменять их.Как изменить видимость элемента управления WPF из ViewModel

ответ

23

В вашем представлении ViewModel вы можете иметь логическое свойство и привязать его к свойству Видимость элементов управления. Так как вы будете asigning логического значения и свойство Visibility ожидает значение видимости перечисления, вам придется использовать BooleanToVisibilityConverter преобразователь для выполнения преобразования,

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

Надеется, что это помогает.

Эзекуэль Jadib

+0

Как-то это не сработало для меня. Я объявил конвертер в разделе Usercontrol.Resources и использовал привязки, как вы объяснили в комментарии. – Raj

+1

Извините, моя ошибка. Это работает. Спасибо. – Raj

8

Хотя добавление логического свойства и с помощью преобразователя значения работы, я бы рекомендовал добавить свойство типа Видимости к вашему ViewModel, например,

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

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

+0

Хотя этот ответ изящный, есть проблема с ним. Если программа меняет 'shouldShowImage', это изменение не отправляется в представление. – James

+1

Это правда, но есть несколько способов решить эту проблему. Вы можете обрабатывать событие 'PropertyChanged' из' shouldShowImage' и поднять новое событие PropertyChanged или разрешить доступ к 'shouldShowImage' через свойство оболочки, которое вызывает события для обоих свойств. – Darren

1

Я знаю, что это старый вопрос, но есть простое решение для людей, которые сталкиваются с этой проблемой и находят этот ответ.

В вашей модели представления, создать свойство "видимости", как так:

public Visibility ShowModifyButtons 
    { 
     get { return (Visibility)GetValue(ShowModifyButtonsProperty); } 
     set { SetValue(ShowModifyButtonsProperty, value); } 
    } 
public static readonly DependencyProperty ShowModifyButtonsProperty = 
     DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel), 
     new UIPropertyMetadata(Visibility.Collapsed)); 

В вашем XAML, привязать к нему так:

<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/> 

Теперь из модели представления, вам может установить ShowModifyButtons на Visibility.Collapsed или Visibility.Visible при необходимости.