Wpf 添加和投标Comboxedit DevExpress

Wpf 添加和投标Comboxedit DevExpress,wpf,data-binding,combobox,devexpress,Wpf,Data Binding,Combobox,Devexpress,我试图从我的类中绑定一个组合框,我在上下文中链接了这个组合框 我控制着这个 <dxe:ComboBoxEdit Width="100" Margin="5" Name="cboProduct" DisplayMember="Name" SelectedItem="{Binding Path=DataContext.SelectedProduct, Mode=OneWay, RelativeSource={RelativeSource

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

我控制着这个

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

        </dxe:ComboBoxEdit>
在这两种情况下,我都使用对象产品

 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}}"
                                  />
如何将值绑定到组合框? 问候

我试着这么做

 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;            
    }
产品列表是一个IPProduct(interface)列表,我不明白他们为什么这样做,但每个产品都是不同的,它们实现相同的基类和接口

[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));
    }
}
没有任何运气。
关于

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

private Product _selectedProduct;
public Product SelectedProduct
{
    get { return _selectedProduct; }
    set
    {
        _selectedProduct = value;
        this.NotifyPropertyChanged("SelectedProduct");
    }
}
对于要选择的初始值,您需要将其设置为实际位于
ItemsSource
lsproducts
)中的
Product
对象:

或者您必须重写
产品
类的
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;
    }
}
我喜欢这样:

我创建了以下方法:

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;
    }
然后,当选择一个许可证时,我设置所有绑定

 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");
        }
    }        
[DataMember]
公共产品精选产品
{
获取{return\u SelectedProduct;}
设置
{                
_所选产品=价值;
此。NotifyPropertyChanged(“SelectedProduct”);
}
}
[数据成员]
公开上市产品
{
获取{return\u Products;}
设置{u乘积=值;
本协议。NotifyPropertyChanged(“产品”);
}
}        
所以,我设置了组合框

 <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

您好mm8我认为问题在于组合在控件内部控件和产品之间是一个新对象,我需要在主窗口中这样设计:_CustomerLicense.SelectedProduct=new Product(SelectedLicense.Product.Name,SelectedLicense.Product.id);我想这是我的问题。我正在填充组合获取数据库的产品并创建一个新的对象产品,许可证对象的原始对象是一个IPProduct,无法分配,因为它是一个interfaceDid。您试图按照我的建议覆盖Equals方法吗?嗨,mm8,是的,我这样做了。当做
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;
    }
}
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;
    }
 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);
 [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>