添加和绑定comboboxEdit DevExpress

时间:2017-09-05 02:52:24

标签: wpf data-binding combobox devexpress

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

我在控件中有这个

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

        </dxe:ComboBoxEdit>

It shows this

我从这样的代码中填充了Combobox befor

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 =&#34; {Binding Path = DataContext.MyProduct,RelativeSource = {RelativeSource AncestorType = Window}}&#34;

我在这个类中创建属性      公共IP产品MyProduct         {             得到{return _MyProduct; }             组             {                 _MyProduct = value;                 this.NotifyPropertyChanged(&#34; myProduct的&#34);             }         }

并且这样做      _CustomerLicense.MyProduct = SelectedLicense.Product;

这就是产品清单的填写方式       public IProduct GetProduct(ProductEnum productId)         {             IProduct product = 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;
    }
没有任何运气。 此致

2 个答案:

答案 0 :(得分:1)

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

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

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

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

或者您必须覆盖Equals类的Product方法:

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;
    }
}

答案 1 :(得分:0)

我修好了这个:

我创建了方法:

button

然后我附加了主窗口的负载,其中所有控件都是

imageView

然后,当选择其中一个许可证时,我设置了所有绑定

private void GetProducts()
      {

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

在我的ViewClass中,我添加了这个

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

所以,我设置了组合框

 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);

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