Как обновить \ обновить один и тот же пользовательский контроль, используемый в нескольких представлениях - PullRequest
0 голосов
/ 28 апреля 2019

Я добавляю запись из представления 2 в базу данных;1. Запись успешно вставлена ​​и сразу же отображается в пользовательском контроле (DataGrid) в том же представлении (View2). 2. Изменения не отображаются в представлении 1, если только я не закрываю представление или приложение и не запускаю его снова.

// INotifyProperty реализован в классе ViewModelBase

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

--------------------------- Вид 1 -------------------------------------

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:UC="clr-namespace:HRSimplified.Controls" 
x:Class="HRSimplified.MainWindow" 
Title="MainWindow" 
Height="628" Width="986">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <UC:EmployeeGridControl Grid.Column="1" />
        </Grid>
</Window>

--------------------------- Вид 2 --------------------------------------

<Window
    x:Class="HRSimplified.Windows.EmployeeDashboard"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:HRSimplified.View"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:VM="clr-namespace:HRSimplified.ViewModel"
    xmlns:UC="clr-namespace:HRSimplified.Controls"
    mc:Ignorable="d"
    Title="EmployeeDashboard">
    <Window.DataContext>
        <VM:ViewModel_Employee />
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="2*" />
        </Grid.ColumnDefinitions>
        <UC:EmployeeGridControl />
         <ItemsControl Grid.Column="1" ItemsSource="{Binding Path=emp}">
                <StackPanel>                                   
                      <TextBox EditValue="{Binding emp.Name, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}" Margin="5" />
<Button Command="{Binding AddCommand, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}" Margin="5" Height="35" />
                </StackPanel>   
          </ItemsControl>
</Window>

------------------------- UserControl ----------------------------------

<UserControl 
 x:Class="HRSimplified.Controls.EmployeeGridControl"
 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:HRSimplified.View"
 xmlns:system="clr-namespace:System;assembly=mscorlib"
 xmlns:VM="clr-namespace:HRSimplified.ViewModel"
 mc:Ignorable="d" 
 d:DesignHeight="450" 
 d:DesignWidth="800">
<Grid>
<DataGrid x:Name="MasterData" MaxHeight="1080" ItemsSource="{Binding MasterData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}">
            <DataGridTextColumn x:Name="Name" Binding="{Binding Mode=TwoWay}" 
              />           
        </DataGrid>       
    </Grid>
</UserControl>

-------------------- ViewModel_Employe ---------------------------------

public class ViewModel_Employee:ViewModelBase{
        public HRSimplifiedEntities Model = new HRSimplifiedEntities();
        private ObservableCollection<Model.Employee> _MasterData;
        public ObservableCollection<Model.Employee> MasterData
        {
            get
            {
                return _MasterData;
            }
            set
            {
                SetProperty(ref this._MasterData, value);
            }
        }
        private Employee _emp;
        private ICommand _submitCommand;
        public Employee emp
        {
            get { return _emp; }
            set
            {
                _emp = value;
                OnPropertyChanged("EmployeeCollection");
            }
        }
        public ViewModel_Employee()
        {
            MasterData = new ObservableCollection<Model.Employee> 
            (Model.Employees.ToList() as IEnumerable<Employee>);
        }

        public ICommand AddCommand
        {
            get
            {
                if (_submitCommand== null)
                {
                    _submitCommand = new RelayCommand(executeMethod, canExecuteMethod, false);
                }
                return _submitCommand;
            }
        }

        private bool canExecuteMethod(object parameter)
        {
            if (string.IsNullOrEmpty(emp.Name) || string.IsNullOrEmpty(emp.Gender) || 
                string.IsNullOrEmpty(emp.Salary.ToString()))
                return false;
            else
                return true;
        }
        private void executeMethod(object parameter)
        {
                MasterData.Add(emp);

                Model.Employees.Add(emp);
                Model.SaveChanges();

                System.Media.SystemSounds.Beep.Play();
        }}

1 Ответ

0 голосов
/ 29 апреля 2019

Я думаю, что вы можете создать объект Singleton из ViewModel_Employee и использовать его как DataContext во всех ваших представлениях.

SingletonClass

 public class ViewModel_Employee  : INotifyPropertyChanged
    {

        private ViewModel_Employee()
        {

        }

        private static ViewModel_Employee privateInstance = null;
        public static ViewModel_Employee Instance
        {
            get
            {
                if (privateInstance == null)
                    privateInstance = new ViewModel_Employee();

                return privateInstance;
            }

            // class is a singleton

        }

DataContext во всех видах:

     <Window.DataContext >
            <x:StaticExtension Member="VM:ViewModel_Employee.Instance" />
        </Window.DataContext> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...