wpf中ListBox的选中项与ComboBox间的绑定

产品类:

public  class Product:NotificationObject
    {
        private int productID;

        public int ProductID
        {
            get { return productID; }
            set { productID = value;
            this.RaisePropertyChanged(()=>this.ProductID);
            }
        }

        private string productName;

        public string ProductName
        {
            get { return productName; }
            set { productName = value;
            RaisePropertyChanged(()=>this.ProductName);
            }
        }

        private double unitPrice;

        public double UnitPrice
        {
            get { return unitPrice; }
            set { unitPrice = value;
            this.RaisePropertyChanged(()=>this.UnitPrice);
            }
        }

        private int categoryID;

        public int CategoryID
        {
            get { return categoryID; }
            set { categoryID = value;
            RaisePropertyChanged(()=>this.CategoryID);
            }
        }
        
    }

引用了Microsoft.Practices.Prism.dll,Using了Microsoft.Practices.Prism.ViewModel名称空间,继承NotificationObject类实现更改通知

产品分类的类:

 public class Categories:NotificationObject
    {
        private int categoryID;

        public int CategoryID
        {
            get { return categoryID; }
            set 
            { 
                categoryID = value;
                this.RaisePropertyChanged(()=>this.CategoryID);
            }
        }

        private string categoryName;

        public string CategoryName
        {
            get { return categoryName; }
            set { categoryName = value;
            this.RaisePropertyChanged(()=>this.CategoryName);
            }
        }

        private string description;

        public string Description
        {
            get { return description; }
            set { description = value;
            this.RaisePropertyChanged(()=>this.Description);
            }
        }
        
    }

后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using BingingComboBox.Models;
using System.ComponentModel;

namespace BingingComboBox
{


    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        //实现INotifyPropertyChanged接口(更改通知)
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
            }
        }

        private Product selectedProduct;
        //listBox选中项
        public Product SelectedProduct
        {
            get { return selectedProduct; }
            set { selectedProduct = value;
            RaisePropertyChanged("SelectedProduct");
            }
        }
        
       //产品类别集合初始化
       private ObservableCollection<Categories>  categoryList = new ObservableCollection<Categories> 
            {
                new Categories{ CategoryID=1,CategoryName="Beverages",Description="Soft drinks, coffees, teas, beers, and ales"},
                new Categories{ CategoryID=2,CategoryName="Condiments",Description="Sweet and savory sauces, relishes, spreads, and seasonings"},
                new Categories{ CategoryID=3,CategoryName="Confections",Description="Desserts, candies, and sweet breads"},
                new Categories{ CategoryID=4,CategoryName="Dairy Products",Description="Cheeses"},
                new Categories{ CategoryID=5,CategoryName="Grains/Cereals",Description="Breads, crackers, pasta, and cereal"},
                new Categories{ CategoryID=6,CategoryName="Meat/Poultry",Description="Prepared meats"},
                new Categories{ CategoryID=7,CategoryName="Produce",Description="Dried fruit and bean curd"},
                new Categories{ CategoryID= 8,CategoryName="Seafood",Description="Seaweed and fish"}
            }; 
    
         private ObservableCollection<Product>  productListList;
        /// <summary>
        /// 产品集合
        /// </summary>
        public ObservableCollection<Product>  ProductList
        {
            get
            {
                if (productListList == null)
                {
                    productListList = new ObservableCollection<Product>();
                }
                return productListList;
            }
            set 
            { 
                productListList = value;
            }
        }   
 
        public MainWindow()
        {
            InitializeComponent();
           
            CollectionViewSource categoriesTypeViewSource = (CollectionViewSource)this.FindResource("categoriesTypeViewSource");
            categoriesTypeViewSource.Source = categoryList;//用于绑定产品类别的ComboBox的ItemSource
CollectionViewSource productsViewSource = (CollectionViewSource)this.FindResource("productsViewSource"); productsViewSource.Source = GetProducts();//用于绑定产品列表ListBox的ItemSource } /// <summary> /// 返回产品列表 /// </summary> /// <returns></returns> public ObservableCollection<Product> GetProducts() { ObservableCollection<Product> productList = new ObservableCollection<Product>() { new Product{ProductID=1,ProductName="Chai",UnitPrice=18.00,CategoryID=1}, new Product{ProductID=2,ProductName="Aniseed Syrup",UnitPrice=10.00,CategoryID=2}, new Product{ProductID=3,ProductName="Teatime Chocolate Biscuits", UnitPrice=18.00,CategoryID=3}, new Product{ProductID=4,ProductName="Raclette Courdavault", UnitPrice=25, CategoryID=4}, new Product{ProductID=5,ProductName="Ravioli Angelo", UnitPrice=55,CategoryID=5}, }; return productList; } /// <summary> /// 弹出框显示产品列表选中项(产品)的信息,用来验证下拉产品分类comboBox, /// 更改产品分类时,产品列表选中项的产品分类id是否改变 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { if (lbProducts.SelectedIndex > -1 && lbProducts.SelectedItem != null) { Product p = lbProducts.SelectedItem as Product; string msg = string.Format("选中的产品{0}:的单价为{1},类别id为:{2}", p.ProductName, p.UnitPrice, p.CategoryID); MessageBox.Show(msg); } } } }



XAML:

<Window x:Class="BingingComboBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Window.Resources>
        <CollectionViewSource x:Key="categoriesTypeViewSource"/>
        <CollectionViewSource x:Key="productsViewSource"/>
    </Window.Resources>
    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <ListBox x:Name="lbProducts" SelectedItem="{Binding Path=SelectedProduct, Mode= TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource ResourceKey=productsViewSource}}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=ProductName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Grid Grid.Column="1" DataContext="{Binding  Path=SelectedProduct, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="产品名称:"/>
                <TextBox Grid.Column="1" Text="{Binding Path=ProductName}"/>
                <TextBlock Grid.Row="1" Text="产品类别:"/>
                <ComboBox Grid.Row="1" Grid.Column="1" 
                          ItemsSource="{Binding Source={StaticResource ResourceKey=categoriesTypeViewSource}}"
                          DisplayMemberPath="CategoryName"  
                          SelectedValuePath="CategoryID" 
                          SelectedValue="{Binding Path=CategoryID,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      />
                <TextBlock Grid.Row="2" Text="产品单价:"/>
                <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=UnitPrice}"/>
                <Button Grid.Row="3" Grid.Column="1"  Content="Show" Click="Button_Click"/>
            </Grid>
        </Grid>
    </Grid>
</Window>


运行效果:

点击“Show”按钮,show出初始值:

下拉产品分类下拉框ComboBox:

点击“Show”按钮,弹出修改后的信息,产品分类id改变:

原文地址:https://www.cnblogs.com/527289276qq/p/4357428.html