Привязка данных и DataContext в приложении WPF Desktop с несколькими представлениями с помощью UserControls - PullRequest
0 голосов
/ 11 февраля 2020

Я работаю над своим первым проектом с WPF и на практике создал приложение, у которого есть строка меню с двумя кнопками сбоку, которые используются для изменения отображения двух разных видов в сетке справа. Я использую шаблон MVVM. Используя интерфейс ICommand, я могу изменить вид в сетке, используя пользовательские элементы управления для двух видов из кнопок панели меню. Приложение выглядит следующим образом:

В строке меню есть кнопки с именами «Вид 1» и «Вид 2», при нажатии любой из которых открывается соответствующий вид в пользовательском контроле. При запуске отображается «defaultview». В представлении по умолчанию есть кнопка, которую также можно использовать для перехода к представлению 1. Ниже показано, что я застрял:

  1. У меня есть кнопка в представлении 1, чтобы изменить отображение на представление. 2 (он вызывает ту же команду, которую я сделал в модели представления приложения, но даже при изменении значения переменной, к которой привязана боковая сетка, отображаемое представление не изменяется).

  2. I хочу передать данные (пробовал с именем) из вида 1 в вид 2, но я не могу получить привязку к работе.

Может ли кто-нибудь направить меня или связать меня с примерами или материалами, которые обсуждают это ?

Модель приложения View

using DataBindingAndViewsTestProject.Views;
using Hotel_Management_Project_WPF.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataBindingAndViewsTestProject.ViewModels
{
    public class AppVM : ObservableObject
    {

        //Create a property that controls current view


        private object _currentView;
        public object CurrentView
        {
            get { return _currentView; }
            set { OnPropertyChanged(ref _currentView, value);
            }
        }



        //Instantiate the relaycommands, we will need to instantiate relaycommand objects for every command we need to perform. 
        //This means that we will need to do this for preses of all buttons
        public RelayCommand View1ButtonCommand { get; private set; }
        public RelayCommand View2ButtonCommand { get; private set; }


        public AppVM()
        {
            CurrentView = new DefaultVM();
            View1ButtonCommand = new RelayCommand(ShowView1, AlwaysTrueCommand);
            View2ButtonCommand = new RelayCommand(ShowView2, AlwaysTrueCommand);

        }



        public void ShowView1(object dummy)
        {
            CurrentView = new View1();

        }

        public void ShowView2(object dummy)
        {
            CurrentView = new View2();
        }


        public bool AlwaysTrueCommand(object dummy)
        {
            return true;
        }

    }
}

Главное окно. Xaml

      <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"></ColumnDefinition>
            <ColumnDefinition Width="600"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0">
            <Button x:Name="view1Button" Content="Go to View 1" Margin="10" Command="{Binding View1ButtonCommand}"></Button>
            <Button x:Name="view2Button" Content="Go to View 2" Margin="10" Command="{Binding View2ButtonCommand}"></Button>
        </StackPanel>
        <Grid Grid.Column="1">
            <ContentControl Content="{Binding CurrentView}"></ContentControl>
        </Grid>
    </Grid>
</Window>

View1.xaml

<UserControl x:Class="DataBindingAndViewsTestProject.Views.View1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DataBindingAndViewsTestProject.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
             xmlns:vm="clr-namespace:DataBindingAndViewsTestProject.ViewModels">
    <UserControl.Resources>
        <vm:AppVM x:Name="AppVMinView1" x:Key="AppVMinView1"></vm:AppVM>
    </UserControl.Resources>
    <UserControl.DataContext>
        <vm:View1VM></vm:View1VM>
    </UserControl.DataContext>
    <Grid Background="Aqua">
        <StackPanel Margin="100">
            <TextBlock Text="First Name"/>
            <TextBox x:Name="firstNameTextBoxView1" Text="{Binding View1InfoClass.FirstName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock Text="Last Name"/>
            <TextBox x:Name="lastNameTextBoxView1" Text="{Binding View1InfoClass.LastName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock Text="Random Useless Number" ></TextBlock>
            <TextBox x:Name="randomUselessNumberView1" Text="{Binding View1InfoClass.Number, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"></TextBox>

            <TextBlock Text="First Name Entered"></TextBlock>
            <TextBlock Text="{Binding View1InfoClass.FirstName}"></TextBlock>
            <TextBlock Text="Last Name Entered" ></TextBlock>
            <TextBlock Text="{Binding View1InfoClass.LastName}"></TextBlock>
            <TextBlock Text="Random Useless Number Entered"></TextBlock>
            <TextBlock Text="{Binding View1InfoClass.Number}"></TextBlock>

            <Button DataContext="{StaticResource AppVMinView1}" Content="Go to view2" Height="20" Width="70" Command="{Binding View2ButtonCommand}" />



        </StackPanel>
    </Grid>
</UserControl>

View2.xaml

    <UserControl x:Class="DataBindingAndViewsTestProject.Views.View2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DataBindingAndViewsTestProject.Views"
             xmlns:vm="clr-namespace:DataBindingAndViewsTestProject.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <vm:View1VM x:Key="View1VMInView2" x:Name="View1VMInView2"></vm:View1VM>
    </UserControl.Resources>
    <UserControl.DataContext>
        <vm:View2VM></vm:View2VM>
    </UserControl.DataContext>
    <Grid Background="Beige">
        <StackPanel Margin="100">
            <TextBlock Text="First Name"/>
            <TextBox x:Name="firstNameTextBoxView2" Text="{Binding View2InfoClass.FirstName, Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock Text="Last Name"/>
            <TextBox x:Name="lastNameTextBoxView2" Text="{Binding View2InfoClass.LastName, Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock Text="Random Useless Number"></TextBlock>
            <TextBox x:Name="randomUselessNumberView2" Text="{Binding View2InfoClass.Number, Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <TextBlock Text="First Name Entered"></TextBlock>
            <TextBlock  DataContext="View1InView2" Text="{Binding View1InfoClass.FirstName}" ></TextBlock>
            <TextBlock Text="Last Name Entered"></TextBlock>
            <TextBlock></TextBlock>
            <TextBlock Text="Random Useless Number Entered"></TextBlock>
            <TextBlock  ></TextBlock>
        </StackPanel>
    </Grid>
</UserControl>

Модель (при необходимости)

  public class InfoClass:ObservableObject
    {
        private string _firstName;

        public string FirstName
        {
            get { return _firstName; }
            set {
                OnPropertyChanged(ref _firstName, value);
                 }
        }

        private string _lastName;

        public string LastName
        {
            get { return _lastName; }
            set { OnPropertyChanged(ref _lastName, value); }
        }

        private int _number;

        public int Number
        {
            get { return _number; }
            set { OnPropertyChanged(ref _number, value); }
        }

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