我现在的主要目标是使用我之前在工作代码中看到过的语法:
{Binding SelectedItem, ElementName=JobTest}
我目前对此代码的理解是ElementName
会覆盖" parent"的常规Binding约定。数据上下文并告诉绑定从其他元素的任何来源拉。 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)));
第一个列表视图是用数据填充的,但是,为什么当我从第一个列表视图中选择一个项目时,它不显示在第二个列表视图中?我将密切关注这篇文章,并乐意接受任何进一步的代码查看请求。谢谢!
答案 0 :(得分:3)
您无法将单个项目绑定到项目列表。正如您所提到的,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>
答案 1 :(得分:1)
如果列表视图选择模式允许多个选择,并且您需要有一种方法将SelectedItems绑定到视图模型,您会发现SelectedItems是只读且不可绑定的。下面是使用System.Windows.Interactivity和Microsoft.Expression.Interactions的解决方法之一。如果您需要,可以从here
下载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都会选择所选项目。
答案 2 :(得分:0)
我看到这个工作的唯一方法如下:
<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"/>