C# 如何在多个视图中使用listview中的选定项
我有一个单独的视图,其中包含一个可观察的集合,并希望在另一个视图(MainView)中使用集合中的选定项。谁能告诉我如何在MainView中实现属性更改 主窗口: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>
<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>