WPF 2列表视图简单选择项数据绑定

时间:2014-05-14 16:15:10

标签: c# wpf listview data-binding

我现在的主要目标是使用我之前在工作代码中看到过的语法:

{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)));

第一个列表视图是用数据填充的,但是,为什么当我从第一个列表视图中选择一个项目时,它不显示在第二个列表视图中?我将密切关注这篇文章,并乐意接受任何进一步的代码查看请求。谢谢!

3 个答案:

答案 0 :(得分:3)

您无法将单个项目绑定到项目列表。正如您所提到的,JobViewModel

  

只是一个具有Name,Description,Schedule等属性的类

一种方法是使用某种GridStackPanel来显示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"/>