Изучение MVVM. Методы вызова - PullRequest
0 голосов
/ 03 августа 2020

Я сейчас изучаю, как работает MVVM, и немного запутался.

Что у меня сейчас: У меня есть MainWindow.xaml и я сделал кнопку, которая добавляет в UserControl1.xaml, добавляя его в ContentControl, и все это отлично работает. У меня есть папка ViewModels с классом SettingsViewModel.cs и еще одна папка с именем Views с UserControl с именем SettingsView.xaml

То, что я пытаюсь выяснить: В Пользовательский контроль У меня будут такие вещи, как кнопки, флажки и некоторые другие вещи. Я хочу иметь возможность нажимать кнопку в MainWindow для вызова метода, в котором я могу делать такие вещи, как изменение видимости элементов среди прочего. Как я go о вызове этого метода из MainWindow и о том, где разместить метод [SettingsViewModels.cs или SettingsView.xaml].

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

У меня обычно получается, что это работает наоборот; вызов метода в MainWindow из UserControl следующим образом ...

//this is in the UserControl
private void Button1_Click(object sender, RoutedEventArgs e)
{
    MainWindow callMethod = (MainWindow)Application.Current.MainWindow;
    callMethod.MyMethod1();
}

//this is in the MainWindow
pubic void MyMethod1()
{
    //whatevery i want here
}

1 Ответ

1 голос
/ 04 августа 2020

Следует учесть несколько моментов. В MVVM View взаимодействует с ViewModel через привязки, а ViewModel взаимодействует с View через события, типичные для INotifyPropertyChanged и ICollectionChanged. Кнопки должны быть привязаны к свойству типа ICommand. ViewModel не должен знать об элементах управления WPF, таких как Visibility et c. Чтобы изменить видимость, вы используете IValueConverter с именем BooleanToVisiblityConverter .

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

Заявление об отказе от ответственности: этот код не запускается, показывает только концепцию. Я оставил Visual Studio на другом компьютере.

ViewModel :

public class MainWindowViewModel
{
    public ICommand OpenCommand { get; }
    public object Child { get; private set; }

    public MainWindowViewModel()
    {
        OpenCommand = new RelayCommand(Open);
    }
    
    private void DoOpen()
    {
        Child = new ChildViewModel();
    }
}

public class ChildViewModel
{
    public bool ShowSomething { get; }
}

public class Program
{
    private void SomeStartupLogic()
    {
        var window = new MainWindow();
        windows.DataContext = new MainWindowViewModel(); // or use an IoC container
        window.Show();
    }
}

View

<Window class="MainWindow">
<Window.Resources>
    <DataTemplate DataType="{x:Type ChildViewModel}">
        <ChildView/>
    </DataTemplate>
</Window.Resources>
    <Grid>
        <ContentControl Content="{Binding Child}"/>
        <Button Command="{Binding OpenCommand}"/>
    </Grid>
</Window>



<UserControl class="ChildView">
<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConvert"/>
</UserControl.Resources>
<Grid>
    <TextBlock Text="Something" Visibility="{Binding ShowSomething, Converter={StaticResource BooleanToVisibilityConvert}/>
</Grid>
</UserControl>

Ссылки

MVVM

Команды

PropertyChanged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...