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

C# WPF 2列表视图简单选定项数据绑定,c#,wpf,listview,data-binding,C#,Wpf,Listview,Data Binding,我现在的主要目标是使用我以前在工作代码中看到的语法: {Binding SelectedItem, ElementName=JobTest} 我目前对这段代码的理解是ElementName覆盖了“父”数据上下文的常规绑定约定,并告诉绑定从其他元素所在的任何源提取SelectedItem显然只是将源代码过滤到所选的源代码 我想做一些非常简单的工作,并决定使用两个元素: <ListView Name="JobTest" ItemsSource="{Binding JobsTest}" Gri

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

{Binding SelectedItem, ElementName=JobTest}
我目前对这段代码的理解是
ElementName
覆盖了“父”数据上下文的常规绑定约定,并告诉绑定从其他元素所在的任何源提取
SelectedItem
显然只是将源代码过滤到所选的源代码

我想做一些非常简单的工作,并决定使用两个
元素:

<ListView Name="JobTest" ItemsSource="{Binding JobsTest}" Grid.Column="2" />
<ListView ItemsSource="{Binding SelectedItem, ElementName=JobTest}" Grid.Column="3"/>
我把它放在这里:

this.myContext.JobsTest = new ObservableCollection<JobViewModel>(data.JobModels.Select(jm => new JobViewModel(jm)));
this.myContext.JobsTest=newobserveCollection(data.JobModels.Select(jm=>newjobViewModel(jm));

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

我所看到的唯一可行的方法是:

<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"/>

我认为这是唯一可行的方法:

<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"/>

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

只是一个具有名称、描述、计划等属性的类

一种方法是使用某种
网格
堆栈面板
来显示
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>

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

只是一个具有名称、描述、计划等属性的类

一种方法是使用某种
网格
堆栈面板
来显示
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.Interactive和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 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);
      }
    }
  }
}
公共类JobViewModel
{
公共ObservableCollection作业测试{get;set;}
公共ObservableCollection SelectedJobs{get;set;}
公共工作视图模型(){
JobsTest=新的ObservableCollection();
SelectedJobs=新的ObservableCollection();
}
公共字符串名{
收到
设置
}
public System.Collections.IList SelectedItems{
得到{
返回所选作业;
}
设置{
SelectedJobs.Clear();
foreach(价值中的JobViewModel模型){
选择的作业。添加(模型);
}
}
}
}

在上面的示例中,每当ListView上的选择发生更改时,ViewModel将拾取所选项目。

如果列表视图选择模式允许多个选择,并且您需要有一种方法将SelectedItems绑定到视图模型,您将发现SelectedItems是只读的,不可绑定。下面是使用System.Windows.Interactive和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 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);
      }
    }
  }
}
公共类JobViewModel
{
公共ObservableCollection作业测试{get;set;}
公共ObservableCollection SelectedJobs{get;set;}
公共工作视图模型(){
JobsTest=新的ObservableCollection();
SelectedJobs=新的ObservableCollection();
}
公共字符串名{
收到
设置
}
public System.Collections.IList SelectedItems{
得到{
返回所选作业;
}
设置{
SelectedJobs.Clear();
foreach(价值中的JobViewModel模型){
选择的作业。添加(模型);
}
}
}
}

在上面的示例中,每当ListView上的选择发生更改时,ViewModel将拾取所选项目。

是实现
IEnumerable
的另一个列表吗?此时,您将一个列表中的选定项绑定到另一个列表控件中显示为项的源否它只是一个具有名称、说明、计划等属性的类。您不能在列表控件中显示单个元素。您需要某种内容控件,
DataContext
将绑定到第一个
Listview
的选定项,例如?我可以试试数据网格或数据模板吗?
JobViewModel
是实现
IEnumerable
的另一个列表吗?此时,您将一个列表中的选定项绑定到另一个列表控件中显示为项的源否它只是一个具有名称、说明、计划等属性的类。您不能在列表控件中显示单个元素。您需要某种内容控件,
DataContext
将绑定到第一个
Listview
的选定项,例如?我可能会尝试使用数据网格或数据模板,但是
SelectedItem
呢?这只是给我一个复制的视图。我想要一个每当我在左侧列表视图中选择一个项目时都会更新的控件。但是
SelectedItem
呢?这只是给我一个复制的视图。我想要一个每当我在左侧列表视图中选择一个项目时都会更新的控件。谢谢!所以真正的问题一定是我尝试的控件不知道如何显示
JobViewModel
。我做了一个愚蠢的假设,因为我的
ListView
至少显示了文件的路径,而我的其他控件也知道如何这样做。在这里,我明确地向它展示了:D
ListView
,以及每个其他的
ItemsControl
,是如何显示项目列表的<有限公司