Member 10528646 Ответов: 1

Как обновить\освежить тот же пользовательский элемент управления, используемый на несколько видов


Я добавляю запись из представления 2 в базу данных;
1. Запись успешно вставлена и мгновенно отображается в пользовательских элементов управления(элемент управления DataGrid) на тот же вид(Изображение2)
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="*" />
            <ColumnDefinition Width="2*" />
        </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:Converters="clr-namespace:HRSimplified.Converters"

    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 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:Converters="clr-namespace:HRSimplified.Converters"

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_Employee

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();
        }


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

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

1 Ответов

Рейтинг:
2

Gerry Schmitz

Каждый вид получает свою собственную коллекцию.

View1 обновляется только потому, что он перезагружает всю коллекцию (с обновлениями из view2).

View1 нуждается в ссылке на коллекцию view2 (которую он может использовать в своей сетке).


Member 10528646

Привет, Джерри Шмитц!
сетка представляет собой отдельный элемент управления UserControl добавлен в представление1 и представление2