【问题标题】:WPF: Binding with two different listsWPF:绑定两个不同的列表
【发布时间】:2015-06-08 18:48:28
【问题描述】:

我在 WPF 中遇到了一些数据绑定问题。

我有一个与 BindingList 绑定的 ListBox。

<ListBox x:Name="SampleListBox" ItemsSource="{Binding List1}" ItemContainerStyle="{StaticResource ListBoxStyle}" BorderThickness="0" SelectedIndex="0" Margin="0">
            <ListBox.ItemTemplate>
                <DataTemplate >
                    <Border x:Name="border" Width="185">
                        <TextBlock Text="{Binding name}"/>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

到这里为止,一切正常。现在我有一个 DataGrid 应该链接到另一个 BindingList 并显示它的一些字符串。例如,如果选择了 ListBox 的第一项,则网格应显示第二个列表的第一项的数据。 我知道,如果 ListBox 和 Grid 都从同一个列表中获取数据,它将如何工作,但我不知道该怎么做,如果这是不可能的并且有两个不同的列表。

【问题讨论】:

    标签: c# wpf list listbox


    【解决方案1】:

    您可以将 ListBox 控件的 SelectedIndex 绑定到 ViewModel 中的 Int (Property1) 类型的属性。

    还将 DataGrid 中的 SelectedItem 双向绑定到第二种列表类型的另一个属性 (Property2)。

    在 Property1 的设置器中,将 Property2 更改为 Property1 索引处的项目 - 即 List2[Property1]。它应该更改 DataGrid 中的选定项。

    【讨论】:

      【解决方案2】:

      所以你想使用列表框,本质上,在网格上设置一个过滤器?

      请注意,下面的 LBItem 和 ViewModel 需要实现 INotifyPropertyChanged 并在属性更改时触发它们的 PropertyChanged 事件,否则这些都不起作用。但为了清楚起见,我省略了样板。

      有很多方法可以做到这一点。

      C#

      public class LBItem {
          public ViewModel Parent { get; set; }
          public IEnumerable<String> SubItems {
              get {
                  return Parent.List2.Where( /* filter items here */ );
              }
          }
      }
      
      public class ViewModel {
          //  
          public ObservableCollection<LBItem> LBItems { get; set; }
          public LBItem SelectedLBItem { get; set; } 
          public List<String> List2 { get; set; }
      }
      

      XAML

      <ListBox 
          Name="MasterLB"
          ItemsSource="{Binding LBItems}" 
          SelectedItem={Binding SelectedLBItem}"
          />
      
      <DataGrid
          ItemsSource="{Binding ElementName=MasterLB, Path=SelectedItem.SubItems}"
          />
      

      无论您是否将MasterLB.SelectedItem 绑定到 ViewModel 上的属性,这都将起作用。但是只要绑定MasterLB.SelectedItem,就可以在ViewModel 上轻松地将DataGrid.ItemsSource 绑定到SelectedLBItem.SubItems,如下所示:

      <DataGrid
          ItemsSource="{Binding Path=SelectedLBItem.SubItems}"
          />
      

      但是 ElementName 绑定对于很多事情都很方便,所以我给你两个。

      你也可以这样做:

      C#

      public class LBItem {
          public IEnumerable<String> Filter(IEnumerable<String> fullList) {
              return fullList.Where( /* filter items here */ );
          }
      }
      
      public class ViewModel {
          public ObservableCollection<LBItem> LBItems { get; set; }
          private LBItem _selectedItem;
          public LBItem SelectedLBItem { 
              get { return _selectedItem; }
              set {
                  _selectedItem = value;
                  List2Filtered = (null == _selectedItem) 
                      ? new List<String>() 
                      : _selectedItem.Filter(List2).ToList();
              }
          } 
          public List<String> List2 { get; set; }
          public List<String> List2Filtered { get; set; }
      }
      

      XAML

      <ListBox 
          Name="MasterLB"
          ItemsSource="{Binding LBItems}" 
          SelectedItem={Binding SelectedLBItem}"
          />
      
      <DataGrid
          ItemsSource="{Binding List2Filtered}"
          />
      

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多