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



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

{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等属性

一种方法是使用某种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>

如果列表视图选择模式允许多次选择,并且您需要有一种方法将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"/>

最新更新