Member 10321925 Ответов: 2

Пользовательских элементов управления видимостью в модели WPF с использованием MVVM


У меня есть 2 элемента управления UserControl в моем главном окне,один со списком некоторых имен, а другой со списком,текстовым полем и кнопкой.Проблема в том, что когда я запускаю приложение, Мое главное окно должно быть только с usercontrol1, а когда я нажимаю на имя, usercontrol2 должен открыться на моем главном окне.Как я могу этого достичь,я новичок в этом, пожалуйста, помогите мне

Marvin Ma

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

Попробуйте сами, это просто.
Если вам нужна помощь, просто спросите.

Marvin Ma

Да, извините, что хотел это отредактировать, но вы были быстрее.

В списке есть события, которые вы ищете:

Например, SelectionChanged.
Если событие было запущено, просто установите видимость, это не самый "чистый" способ, но если вы новичок в MVVM, это будет первый шаг.

Marvin Ma

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

То же самое справедливо и для пользовательского элемента управления.

Marvin Ma

Определите свойство, которое обрабатывает видимость (например, UserControlVisibility), и привяжите его к свойству visibility вашего пользовательского элемента управления.

Вы должны использовать BoolToVisibilityConverter.

Созданное вами свойство (UserControlVisbility) будет установлено, если вы выберете элемент своего списка (в вашем случае имя).
Убедитесь, что вы переключили видимость, когда имя не выбрано (посмотрите на выбранный элемент).

А теперь попробуйте записать эту логику...Я мог бы сделать это для вас, но это не будет иметь никакого эффекта обучения для вас.

Помните: учитесь на практике!

Member 10321925

хорошо спасибо тебе

Member 10321925

частный bool _selectedItem;
public bool SelectedItem
{
get { return _selectedItem; }
набор
{
_selectedItem = значение;
PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
}
}

Member 10321925

Я сделал это, и его работа, когда я запускаю приложение usercontrol2, не видна...но не знаю, как получить usercontrol2, когда элемент списка выбран, я пытался, но не смог его получить

2 Ответов

Рейтинг:
2

_Maxxx_

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

Если это так, то привязка свойства ListBox SelectedItem к вашему ViewModel сообщит вам, если что-то выбрано, и если да, то что это такое.

Затем вы можете привязать видимость вашего второго пользовательского элемента управления с помощью конвертера к тому же свойству SelectedItem - конвертеру, возвращающему видимость.Свернутый (или скрытый), если входное значение равно Null, и возвращающий Visibility.Visible, если нет.


Рейтинг:
2

Ashutosh Gpt

Datatrigger-это еще один вариант достижения этой цели.
дайте имена вашим элементам управления и напишите триггеры на MainControl
defaul user control visibility = видимый, а видимость элемента управления 2 свернута.

Присвойте имя кнопке usercontrol2 на главном окне, при нажатии на это имя должен открыться usercontrol 2.

<DataTrigger Binding="{Binding userContro2name.IsFocused} value = true> // or may be some other property which changes when you click on name.
<Setter Property ="nameofUserControl2".Visibility Value="Visible"/>
<Setter Property ="nameofUserControl1".Visibility Value="Collapsed"/>
</DataTrigger >

<DataTrigger Binding="{Binding userContro2name.IsFocused} value = false>
<Setter Property ="nameofUserControl2".Visibility Value="Collapsed"/>
<Setter Property ="nameofUserControl1".Visibility Value="Visible"/>
</DataTrigger >


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