Knowledged Ответов: 3

Пример базы для нескольких диалоговых окон просмотра


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

Моя цель - иметь возможность переключать представления в диалоге с datatemplates. Поэтому для этого примера я использую materialdesign toolkit и создаю диалоговое окно входа в систему при нажатии кнопки на форме.

Таким образом, диалог входа в систему будет иметь имя пользователя и passwordbox с кнопкой входа в систему на нем, теперь, когда вы нажимаете login и если passwordbox password = "пароль", то показываете другое представление диалога для изменения пароля (ничего не должно быть на нем), иначе он показывает вошедшее представление (также ничего больше не должно быть на нем).

Я надеюсь, что это имеет смысл, и я надеюсь, что смогу получить помощь здесь в этой ситуации. Спасибо!

Что я уже пробовал:

До сих пор я только пробовал код позади, скрывая и показывая элементы управления, которые могут стать утомительными.

3 Ответов

Рейтинг:
1

#realJSOP

Это плохой дизайн. Заставьте пользователя нажать кнопку "Изменить пароль", чтобы изменить пароль. Когда кнопка нажата, отобразите новую форму для этой цели.

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


Knowledged

Нет, он покажет диалоговое окно смены пароля, если пароль == пароль по умолчанию.

Рейтинг:
1

Maciej Los

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

Проверить это: Переключение между представлениями xaml в mvvm | technical-recipes.com[^]


Knowledged

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

Рейтинг:
0

Richard Deeming

Если вы используете MVVM, один из вариантов, который сработал для меня, - это использовать комбинацию DataTemplate и ContentControl.

То ContentControlContent свойство привязывается к свойству в viewmodel, типизированному как object Это свойство устанавливается в экземпляр определенного класса viewmodel, представляющего страницу, которую я хочу отобразить. То DataTemplate для этого класса ViewModel используется UserControl для отображения страницы.

Например:

Файл MainWindow.язык XAML

<Window

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:views="clr-namespace:..."

    xmlns:vm="clr-namespace:..."

    ...

>
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:MainWindowLoadingViewModel}">
            <views:MainWindowLoadingView />
        </DataTemplate>
        
        <DataTemplate DataType="{x:Type vm:MainWindowAccessDeniedViewModel}">
            <views:MainWindowAccessDeniedView/>
        </DataTemplate>
        
        ...
    </Window.Resources>
    
    <ContentControl Content="{Binding Path=CurrentPage}" />
</Window>
MainWindowViewModel.в CS
public class MainWindowViewModel : ViewModelBase
{
    private object _currentPage = new MainWindowLoadingViewModel();
    
    public object CurrentPage
    {
        get { return _currentPage; }
        private set { SetProperty(ref _currentPage, value); }
    }
    
    private void OnLoaded()
    {
        if (!UserCanAccessApplication)
        {
            CurrentPage = new MainWindowAccessDeniedViewModel();
            return;
        }
        
        ...
    }
}