Как использовать выбранные элементы из списка в нескольких представлениях - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть отдельное представление, которое содержит наблюдаемую коллекцию и хотел бы использовать выбранный элемент из коллекции в другом представлении (MainView). Может кто-нибудь сказать мне, как реализовать изменение свойства в MainView?

Главное окно:

<Window.DataContext>
        <local:MainWindowViewModel x:Name="mainWindowViewModel"/>
    </Window.DataContext>
    <Window.Resources>
        <view:OwnerListViewModel x:Key="OwnerList"/>
    </Window.Resources>


            <TextBlock Height="25" Margin="0 5 0 0" Grid.Row="1" Grid.Column="0" Text="{Binding 
                       PersonModel.FirstName}" ></TextBlock>
            <TextBlock Height="25" Margin="0 5 0 0" Grid.Row="1" Grid.Column="1" Text="{Binding 
                       PersonModel.SurName}" Grid.ColumnSpan="2"></TextBlock>

В MainWindowViewModel:

 private OwnerListViewModel OwnerListViewModel { get; } = new OwnerListViewModel();

        public Owner PersonModel
        {
            get { return OwnerListViewModel.PersonModel; }
            set { OwnerListViewModel.PersonModel = value; OnPropertyChanged(); }
        }

В окне LoadOwner, я создал ListView:

 <Window.DataContext>
        <view:OwnerListViewModel/>
    </Window.DataContext>
        <ListView Grid.Column="0" ItemsSource="{Binding PersonsView}" SelectedValue="{Binding 
         PersonModel, Mode=TwoWay}">

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectionChangedCmd}" 
                                           CommandParameter="{Binding 
                                           ElementName=PersonListWindow}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Height="auto">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>                            
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Margin="0 0 5 0" VerticalAlignment="Center"
                         Text="{Binding FirstName}"/>
                        <TextBlock Grid.Column="1" VerticalAlignment="Center" 
                         Text="{Binding SurName}"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Мой OwnerListViewModel:

Здесь я не уверен, как реализовать изменение свойства. Использование асинхронной задачи или есть другие варианты? Буду очень признателен за подсказку!

public OwnerListViewModel()
        {
            Persons = new ObservableCollection<Owner>();

            var sample1 = new Owner()
            {
                FirstName = "SampleFirstName1",
                SurName = "SampleLastname1",
                Street = "SampleStreet1",
                HouseNumber = 987,
                AdditionalAdress = "",
                ZipCode = 99999,
                City = "SampleCity1"
            };
            AddOwner(sample1);

            PersonsView = CollectionViewSource.GetDefaultView(Persons);
            PersonsView.CurrentChanged += (s, e) =>
            {
                OnPropertyChanged(() => PersonModel);
            };

            SelectionChangedCmd = new RelayCommand<Window>(this.closeWindow);
        }

        #region listProperties

        private ObservableCollection<Owner> Persons { get; }

        public ICollectionView PersonsView { get; set; }

        public Owner PersonModel
        {
            get => PersonsView.CurrentItem as Owner;
            set
            {
                PersonsView.MoveCurrentTo(value);
                OnPropertyChanged();

            }
        }

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

решение состоит в том, чтобы установить контекст данных непосредственно в главном окне:

 <TextBox Height="25" Margin="0 5 0 0" Grid.Row="1" Grid.Column="0" DataContext="{Binding OwnerListViewModel.SelectedItem}" Text="{Binding FirstName}" ></TextBox>
            <TextBox Height="25" Margin="0 5 0 0" Grid.Row="1" Grid.Column="1" DataContext="{Binding OwnerListViewModel.SelectedItem}" Text="{Binding SurName}" Grid.ColumnSpan="2"></TextBox>
0 голосов
/ 11 февраля 2020

Вы создали разные объекты OwnerListViewModel. Один из способов - удалить этот код из двух представлений:

<Window.Resources>
    <view:OwnerListViewModel x:Key="OwnerList"/>
</Window.Resources>

и связать текст данных в коде представления:

var ownerListViewModel = new OwnerListViewModel();
LoadOwnerWindow.DataContext = ownerListViewModel;   
MainView.DataContext = ownerListViewModel.PersonModel;

Также вы можете использовать Io C для привязки моделей представления.

Также другим способом является использование мессенджера WPF для отправки измененного владельца в виде сообщения из LoadOwnerWindow в MainView

...