【问题标题】:Add and Biding comboboxEdit DevExpress添加和出价组合框编辑 DevExpress
【发布时间】:2017-09-05 02:52:24
【问题描述】:

我试图从我在上下文中链接的班级中绑定一个组合框

我在控件中有这个

 <dxe:ComboBoxEdit Width="100" Margin="5" Name="cboProduct" DisplayMember="Name"
                          SelectedItem="{Binding Path=DataContext.SelectedProduct, Mode=OneWay,  RelativeSource={RelativeSource AncestorType=Window}}"
                          >

        </dxe:ComboBoxEdit>

我从后面的代码中填充了之前的组合框

var lsproducts = new List<Product>();
        var Products =_licenseService.GetProductList();
        Products.ForEach((x) => {
            lsproducts.Add(new Product(x.Name, x.ProductId));
        });

我像这样设置 SelectedProduct

 [DataMember]
    public License SelectedLicense {
        get { return _SelectedLicense;}
        set {                      
            _SelectedLicense = value;                
            this.NotifyPropertyChanged("SelectedLicense");
        }
    }        

    public Product SelectedProduct
    {
        get
        {             
            return new Product(_SelectedLicense.Product.Name,_SelectedLicense.Product.ProductId);
        }             
    }

        this.cboProduct.ItemsSource = lsproducts.ToArray();

在这两种情况下,我都使用对象产品

 using System;
 using System.Collections.Generic;
using System.Linq;
using System.Text;
using pd.Common.Domain;

namespace LicenceManagerWPF.Views
{
public class Product
{
    public string Name { get; set; }
    public ProductEnum ProductID { get; set; }

    public Product(string ProductName,ProductEnum ID)
    {
        Name = ProductName;
        ProductID = ID;
    }

}

我不知道为什么我打开窗口时没有选择产品。

我还有一个 [![这样显示][2]][2]

我不知道为什么它显示 x 标记,但是当我选择另一个许可证时,它更新了组合选择

 <dxe:ComboBoxEdit x:Name="cboActivationMode" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Width="100" Style="{StaticResource TabMargin}"                                       
                                  SelectedItem="{Binding Path=DataContext.SelectedLicense.ActivationMode, RelativeSource={RelativeSource AncestorType=Window}}"
                                  />

第二个它只有几个像这样填充的枚举值。

 cboActivationMode.Items.Add(
            new DevExpress.Xpf.Editors.ComboBoxEditItem()
            { Content = Enum.GetName(typeof(ActivationMode), ActivationMode.Online), Tag = ActivationMode.Online });

如何将值绑定到组合框? 问候

        cboActivationMode.Items.Add(            
            new DevExpress.Xpf.Editors.ComboBoxEditItem()
            {Content = Enum.GetName(typeof(ActivationMode), ActivationMode.Offline),Tag = ActivationMode.Offline});

我尝试过这样做

 public partial class LicenseDetail : UserControl
{
    private readonly LicenseService _licenseService;
    public LicenseDetail()
    {
        InitializeComponent();
        _licenseService = new LicenseService();            
        FillCombos();
    }

    private void FillCombos()
    {
        FillProducts();
        FillActivationMode();
        //var str = Enum.GetName(typeof(ProductEnum), ProductEnum.CDSAddIn);
        //this.cboProduct.ItemsSource = new string[] { str };
    }

    private void FillProducts()
    {

        var Products = _licenseService.GetProductList();
        cboProduct.ItemsSource = Products;            
    }

产品列表是 Iproduct(接口)的列表,我不明白他们为什么这样做,但每个产品都不同,它们实现相同的基类和接口

[DataContract]
public class ProductList : List<IProduct>
{
    public bool Contains(ProductEnum productId)
    {
        return this.Any(x => x.ProductId == productId);
    }

    public IProduct GetProduct(ProductEnum productId)
    {
        return this.FirstOrDefault(x => x.ProductId == productId);
    }

    public void Remove(ProductEnum productId)
    {
        Remove(GetProduct(productId));
    }
}

我将组合更改为像这样绑定 SelectedItem="{Binding Path=DataContext.MyProduct,RelativeSource={RelativeSource AncestorType=Window}}"

我像这样在类中创建属性 公共 IProduct 我的产品 { 得到{返回_MyProduct; } 放 { _MyProduct = 价值; this.NotifyPropertyChanged("MyProduct"); } }

像这样进行攻击 _CustomerLicense.MyProduct = SelectedLicense.Product;

这就是产品列表的填写方式 公共 IProduct GetProduct(ProductEnum productId) { IProduct 产品 = null;

        var connection = GetConnection();

        try
        {
            var sql = string.Format(Resources.GetProduct, (int)productId);
            var cmd = new SqlCommand(sql, connection) { CommandType = CommandType.Text, Transaction = _transaction };
            using (var rdr = new NullableDataReader(cmd.ExecuteReader()))
                while (rdr.Read())
                {
                    var productName = rdr.GetString(0);
                    var featureId = rdr.GetInt32(1);
                    var featureDesc = rdr.GetString(2);
                    if (product == null)
                    {
                        switch (productId)
                        {
                            case ProductEnum.PDCalc:
                                product = new PDCalcProduct(productId, productName);
                                break;
                            case ProductEnum.PDMaint:
                                product = new PDMaintProduct(productId, productName);
                                break;
                            case ProductEnum.PBDynamics:
                                product = new PBDynamicsProduct(productId, productName);
                                break;
                            case ProductEnum.CDSAddIn:
                                product = new CDSAddInProduct(productId, productName);
                                break;
                        }
                    }
                    if (product != null)
                        product.Features.Add(new Feature((FeatureEnum)featureId, featureDesc));
                }
        }
        finally
        {
            CloseConnection(connection);
        }

        return product;
    }

没有任何运气。 问候

【问题讨论】:

    标签: wpf data-binding combobox devexpress


    【解决方案1】:

    SelectedProduct 属性应该有一个公共设置器,以便您能够将其设置为ComboBox 中当前选定的值:

    private Product _selectedProduct;
    public Product SelectedProduct
    {
        get { return _selectedProduct; }
        set
        {
            _selectedProduct = value;
            this.NotifyPropertyChanged("SelectedProduct");
        }
    }
    

    对于要选择的初始值,您需要将其设置为实际位于 ItemsSource (lsproducts) 中的 Product 对象:

    viewModel.SelectedProduct = lsproducts.FirstOrDefault(x => x.Name == _SelectedLicense.Product.Name && x.ProductID == _SelectedLicense.Product.ProductId);
    

    否则您将不得不覆盖 Equals 类的 Equals 方法:

    public class Product
    {
        public string Name { get; set; }
        public ProductEnum ProductID { get; set; }
    
        public Product(string ProductName, ProductEnum ID)
        {
            Name = ProductName;
            ProductID = ID;
        }
    
        public override bool Equals(object obj)
        {
            Product other = obj as Product;
            return other != null && Name == other.Name && ProductID == other.ProductID;
        }
    }
    

    【讨论】:

    • 嗨 mm8 我认为问题在于组合在控件内
    • 在控件内部,Product 是一个新对象,我需要在主窗口中这样分配:_CustomerLicense.SelectedProduct = new Product(SelectedLicense.Product.Name, SelectedLicense.Product.ProductId);我认为这是我的问题。我填充组合获取数据库的产品并创建一个新对象产品,许可证对象的原始是一个 IProduct,因为它是一个接口,所以无法分配
    • 您是否按照我的建议尝试覆盖 Equals 方法?
    • 嗨,mm8,是的,我做到了。问候
    【解决方案2】:

    我是这样解决的:

    我创建了方法:

    private void GetProducts()
          {
    
            var Products = new LicenseService().GetProductList();
            Products.ForEach((x) =>
            {
                lsproducts.Add(new Product(x.Name, x.ProductId));            
            });
            //this.cboProduct.ItemsSource = lsproducts.ToArray();
        }
    

    然后我附加到所有控件所在的主窗口的负载

    public frmCustomerLicense(CustomerLicenses cl)
        {
            InitializeComponent();
            GetProducts();
            _CustomerLicense = cl;
            grdLicenses.grdLicences.SelectedItemChanged += GridRowSelected;
        }
    

    Then when one of the licenses is selected i set all the bindings

     var Record = (DataRowView)grdLicenses.grdLicences.SelectedItem;
                var SelectedLicense = (License)Record["License"];
                var list = new LicenseService().GetActivityLog(SelectedLicense.SerialNumber)
               .OrderByDescending(x => x.ActivityDate)
               .ToList();
    
    
                _CustomerLicense.ActivityLog = list;
                _CustomerLicense.Features = new LicenseService().GetFeatures(SelectedLicense.Product.ProductId);
                _CustomerLicense.Products = lsproducts;
                _CustomerLicense.HasExpDate = SelectedLicense.HasExpirationDate;
                //_CustomerLicense.SetLog(list);
                _CustomerLicense.SelectedLicense = SelectedLicense;
                //_CustomerLicense.SelectedMaintenance = SelectedLicense.Product.ProductId == ProductEnum.PDMaint ? true : false;                                
                _CustomerLicense.SelectedProduct = lsproducts.FirstOrDefault((x) => x.ProductID == SelectedLicense.Product.ProductId);
    

    在我的 ViewClass 中我添加了这个

     [DataMember]
        public Product SelectedProduct
        {
            get { return _SelectedProduct; }
            set
            {                
                _SelectedProduct = value;
                this.NotifyPropertyChanged("SelectedProduct");
            }
        }
    
        [DataMember]
        public List<Product> Products
        {
            get { return _Products; }
            set { _Products = value;
                this.NotifyPropertyChanged("Products");
            }
        }        
    

    所以,我设置了组合框

     <dxe:ComboBoxEdit Width="180" Margin="5" Name="cboProduct" DisplayMember="Name" 
                              ItemsSource="{Binding Path=DataContext.Products, RelativeSource={RelativeSource AncestorType=Window}}"
                              SelectedItem="{Binding Path=DataContext.SelectedProduct, RelativeSource={RelativeSource AncestorType=Window}}"
                              >                
            </dxe:ComboBoxEdit>
    

    这样做很有效,感谢您的帮助 mm8

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多