【问题标题】:WPF ListView binding from another listview来自另一个列表视图的 WPF ListView 绑定
【发布时间】:2014-03-17 07:18:52
【问题描述】:

首先查看我的数据库 - LINK 和我的 ListView Binding

在第一个 ListView 中,我从表“TestSubjectsNames”中显示了“TestSubjectName”,当我从表“Tests”中选择要在第二个 ListView“TestName”中显示的项目时,其中“TestSBJNameID”==“ID”来自第一个 ListView 中的选定项目.

这是我关于第二个 ListView 的代码的一部分,但它不正确。

    private IEnumerable<Tests> testsNames;

    public IEnumerable<Tests> TestsNames
    {
        get
        {
            if (this.testsNames== null)
            {
                this.testsNames= BindingData.GetAllTestsNames;
            }
            return this.testsNames;
        }
    }

    public static IEnumerable<Tests> GetAllTestsNames
    {
        get
        {
            return new Model().TestsNames.Where(t => t.ID == FIRST-LISTVIEW-SELECTED-INDEX).Select(c => new Tests 
            {
                testNameID = c.ID,
                testName = c.TestsNames                   
            });
        }            
    }

如果有人有任何其他解决方案,如何从第一个 ListView 中选择到在第二个 ListView 中显示项目,请告诉我。

【问题讨论】:

    标签: c# wpf database listview binding


    【解决方案1】:

    我认为有很多方法可以做你想做的事,这就是我会做的:

    在代码隐藏中

    public class TestWindow
    {
    
        // A collection of SubjectNames to bind with the first listview
        private ObservableCollection<TestsSubjectsNames> _subjectNames;
        public ObservableCollection<TestsSubjectsNames> SubjectNames
        {
            get { return _subjectNames; }
            set
            {
               _subjectNames = value;
               NotifyPropertyChanged("SubjectNames");
            }
        }
    
        // A collection of Test for the second listview
        private ObservableCollection<Tests> _testNames;
        public ObservableCollection<Tests> TestNames
        {
            get { return _testNames; }
            set
            {
               _testNames= value;
               NotifyPropertyChanged("TestNames");
            }
        }
    
        // The current selected TestsSubjectsNames in first listview
        private TestsSubjectsNames _selectedSubjectNames;
        public TestsSubjectsNames SelectedSubjectNames
        {
            get { return _selectedSubjectNames; }
            set
            {
               _selectedSubjectNames= value;
               // Call this function in the setter
               // Will change the Collection binded to the second listview
               OnSelectedSubjectNameChanged(value);
               NotifyPropertyChanged("SelectedSubjectNames");
            }
        }
    
        public TestWindow()
        {
            // Initialization and set datacontext
            InitializeComponent();
            DataContext = this;
    
            // Initialize the suject name list for the first listview
            SubjectNames = GetAllSubjectNames();
    
            // Second listview empty until we select something in the first list
            // so initialize it empty
            TestNames = new ObservableCollection<Tests>();
        }
    
        // Will be called everyTime the selectedItem in the first listview changes
        private void OnSelectedSubjectNameChanged(TestsSubjectsNames subjectName)
        {
              // Get The list of Tests with the selected subjectName ID
              // and put the result in the observable collection
              TestNames = new ObservableCollection<Tests>(GetAllTestsNames(subjectName.ID))
        }
    }
    

    现在您只需在 XAML 中正确绑定

    第一个列表视图:

     // SelectedItem attribute very important
     <ListView  
          ItemsSource="{Binding SubjectNames}" 
          SelectedItem="{Binding SelectedSubjectNames}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    // show a textblock with the TestsSubjectName property
                    // of TestsSubjectsNames class 
                    <TextBlock Text="{Binding TestsSubjectName}" />
                </WrapPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
     </ListView>
    

    第二个列表视图

     <ListView ItemsSource="{Binding TestNames}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    // show a textblock with the TestName property
                    // of Tests class 
                    <TextBlock Text="{Binding TestName}" />
                </WrapPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
     </ListView>
    

    在第一个 ListView 中,我们将 SelectedItem 与 SelectedSubjectNames 绑定,并且每次设置 SelectedSubjectNames 时,我们调用函数 OnSelectedSubjectNameChanged 来更改 TestNames 集合。

    由于TestNames在第二个ListView中被绑定为itemsSource,所以每次选择不同的主题名时,第二个listview中都会出现测试名称列表。

    希望它足够清楚并回答了您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2014-04-02
      相关资源
      最近更新 更多