C# 如何在多个视图中使用listview中的选定项

C# 如何在多个视图中使用listview中的选定项,c#,wpf,listview,mvvm,data-binding,C#,Wpf,Listview,Mvvm,Data Binding,我有一个单独的视图,其中包含一个可观察的集合,并希望在另一个视图(MainView)中使用集合中的选定项。谁能告诉我如何在MainView中实现属性更改 主窗口: <Window.DataContext> <local:MainWindowViewModel x:Name="mainWindowViewModel"/> </Window.DataContext> <Window.Resources>

我有一个单独的视图,其中包含一个可观察的集合,并希望在另一个视图(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>
在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>

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

            }
        }
public OwnerListViewModel()
{
人员=新的可观察集合();
var sample1=新所有者()
{
FirstName=“SampleFirstName1”,
姓氏=“SampleLastname1”,
Street=“SampleStreet1”,
门牌号=987,
附加地址=”,
ZipCode=99999,
City=“SampleCity1”
};
AddOwner(样本1);
PersonView=CollectionViewSource.GetDefaultView(个人);
PersonView.CurrentChanged+=(s,e)=>
{
OnPropertyChanged(()=>PersonModel);
};
SelectionChangedCmd=new RelayCommand(此.closeWindow);
}
#区域列表属性
私人可观察收集人{get;}
公共ICollectionView个人视图{get;set;}
公共所有者个人模型
{
get=>PersonView.CurrentItem作为所有者;
设置
{
PersonView.MoveCurrentTo(值);
OnPropertyChanged();
}
}

您创建了OwnerListViewModel的不同对象。一种方法是从2个视图中删除此代码:

<Window.Resources>
    <view:OwnerListViewModel x:Key="OwnerList"/>
</Window.Resources>
还可以使用IoC绑定视图模型


另外,另一种方法是使用WPF messenger将更改的所有者作为消息从LoadOwnerWindow发送到MainView。解决方案是直接在主窗口中设置数据上下文:

 <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>

var ownerListViewModel = new OwnerListViewModel();
LoadOwnerWindow.DataContext = ownerListViewModel;   
MainView.DataContext = ownerListViewModel.PersonModel;
 <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>