Как взаимодействовать между моделью основного представления и моделью представления пользовательского элемента управления - PullRequest
0 голосов
/ 09 июля 2020

У меня есть модель основного вида, и в некоторых случаях она загружает некоторые пользовательские элементы управления (стабильность, бак). Эти пользовательские элементы управления имеют модели просмотра, такие как StabilityVM, TankVM. Мой вопрос в том, как отправлять данные из модели основного представления в модель представления пользовательского элемента управления или наоборот. Мой main.xaml и его модель представления показаны ниже

Часть xaml главного окна

<ContentControl  Grid.Row="1" Content="{Binding 
ActiveUserControl,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type vm:TankVM}">
                <uc:Tank></uc:Tank>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:StabilityVM}">
                <uc:Stability></uc:Stability>
            </DataTemplate>
        </ContentControl.Resources>

    </ContentControl>

Часть модели главного окна

public class MainVM : INotifyPropertyChanged
{
    Stability stability;
    Tank tank;
    WeightItem weightItem;
  
    public List<Grid> myControls = new List<Grid>();
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    private UserControl activeUserControl;

    public UserControl ActiveUserControl
    {
        get { return activeUserControl; }
        set { activeUserControl = value;
            OnPropertyChanged(nameof(ActiveUserControl));
        }
    }

    public MainVM()
    {
        //First user control class
        stability = new Stability();
        stability.Visibility = Visibility.Visible;
        //Second user control class
        tank = new Tank();
        tank.Visibility = Visibility.Visible;

        ActiveUserControl = stability;
        ActiveUserControl.Visibility = Visibility.Visible;
        
    }
}

1 Ответ

0 голосов
/ 09 июля 2020

Для связи между моделями представления вы можете использовать шаблон посредника . Многие платформы приложений WPF, такие как Caliburn.Micro или Prism , предлагают конкретную реализацию этого шаблона, поэтому вам не нужно реализовывать его самостоятельно. Оба они предлагают так называемый агрегатор событий для обмена данными через слабосвязанные события.

Например, в Prism вы должны определить тип события с аргументами события или без них.

// Events derive from PubSubEvent or PubSubEvent<T> if you use event aruments
public class TankChangedEvent : PubSubEvent<TankChangedEventArgs>
{
}

// Event arguments for the above event, uses a property to capture the changed tank
public class TankChangedEventArgs
{
    public Tank Tank { get; }

    TankChangedEventArgs(Tank tank)
    {
        Tank = tank;
    }
}

Затем в модели представления отправителя вы используете агрегатор событий для публикации sh события. Обратите внимание, что вам необходимо создать или внедрить экземпляр eventAggregator агрегатора событий.

var args = new TankChangedEventArgs(changedTank);
eventAggregator.GetEvent<PartsDeletedEvent>().Publish(args);

В модели представления-получателя вам необходимо подписаться на событие, например, в конструкторе.

eventAggregator.GetEvent<LogicalDirectoriesChangedEvent>().Subscribe(OnTankChanged);

Создать метод OnTankChanged для обработки события при его получении.

private void OnLogicalDirectoriesChanged(TankChangedEventArgs args)
{
    // Do something with the event arguments
}

Подробнее об этом можно прочитать здесь . Пример в Caliburn Micro можно найти на на этом сайте . Хотя эти механизмы встроены в соответствующие фреймворки, вы также можете использовать их изолированно в своем проекте без миграции всего приложения. Однако есть и другие реализации, но эти фреймворки являются хорошей отправной точкой, поскольку у них есть исчерпывающая документация по ним c.

...