我现在的主要目标是使用我之前在工作代码中看到的语法:
{Binding SelectedItem, ElementName=JobTest}
我目前对这段代码的理解是,ElementName
覆盖了"父"数据上下文的常规绑定约定,并告诉绑定从任何源提取其他元素。SelectedItem
显然只是将源过滤到选定的源。
我想得到一些非常简单的工作,并决定使用两个<ListView>
元素:
<ListView Name="JobTest" ItemsSource="{Binding JobsTest}" Grid.Column="2" />
<ListView ItemsSource="{Binding SelectedItem, ElementName=JobTest}" Grid.Column="3"/>
一个具有常规绑定到ObservableCollection
,另一个仅显示从第一个选择的。
这是我在DataContext
中设置和使用的属性:
public ObservableCollection<JobViewModel> JobsTest { get; set; }
我设置在这里:
this.myContext.JobsTest = new ObservableCollection<JobViewModel>(data.JobModels.Select(jm => new JobViewModel(jm)));
第一个列表视图正在填充数据,但是,为什么当我从第一个列表视图中选择一个项目时,它没有显示在第二个列表视图中?我将继续关注这篇文章,并乐意满足任何进一步的代码查看请求。谢谢!
不能将单个项目绑定到项目列表。因为,正如你提到的,JobViewModel
一种方法是使用某种只是一个类,它具有Name, Description, Schedule等属性
Grid
或StackPanel
来显示SelectedItem
的字段<ListView Name="JobTest" ItemsSource="{Binding JobsTest}" Grid.Column="2" />
<StackPanel DataContext="{Binding SelectedItem, ElementName=JobTest}" Grid.Column="3">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Description}"/>
<TextBlock Text="{Binding Schedule}"/>
</StackPanel>
如果列表视图选择模式允许多次选择,并且您需要有一种方法将SelectedItems绑定到视图模型,您会发现SelectedItems是只读的,不可绑定的。下面是使用System.Windows.Interactivity和Microsoft.Expression.Interactions的变通方法之一。如果你需要这些,可以从这里下载
XAML中附加的命名空间声明
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
XAML:
<ListView Name="JobTesList" ItemsSource="{Binding JobsTest}" DisplayMemberPath="Name" Grid.Column="0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedItems" Value="{Binding Path=SelectedItems, ElementName=JobTesList}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>
<ListView ItemsSource="{Binding SelectedItems}" DisplayMemberPath="Name" Grid.Column="1"/>
视图模型:
public class JobViewModel
{
public ObservableCollection<JobViewModel> JobsTest { get; set; }
public ObservableCollection<JobViewModel> SelectedJobs { get; set; }
public JobViewModel() {
JobsTest = new ObservableCollection<JobViewModel>();
SelectedJobs = new ObservableCollection<JobViewModel>();
}
public string Name {
get;
set;
}
public System.Collections.IList SelectedItems {
get {
return SelectedJobs;
}
set {
SelectedJobs.Clear();
foreach (JobViewModel model in value) {
SelectedJobs.Add(model);
}
}
}
}
在上面的例子中,当ListView上的选择发生变化时,你的ViewModel将拾取选中的项目。
我看到的唯一可行的方法是:
<ListView Name="JobTest" ItemsSource="{Binding JobsTest}" Grid.Column="2" />
<ListView ItemsSource="{Binding Path=DataContext.JobsTest, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Grid.Column="3"/>