2017-09-05 57 views
0

我试着去一个组合框从我的课,我在上下文添加和招投标comboboxEdit的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)); 
     }); 

而im设置这样

[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(); 
在这两种情况下

的SelectedProduct即时通讯使用对象产品

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标志,但是当我chouse另一许可证更新它的组合选择

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

我tryed做这个

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(接口),我不明白为什么他们把它像这样的列表,但每个产品是他们实施diferent相同的基类和接口

[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 =“{绑定路径= DataContext.MyProduct,R elativeSource = {的RelativeSource AncestorType =窗口}}”

我创建这样 公共IProduct myProduct的 { 得到的类属性{返回_MyProduct; } set { _MyProduct = value; this.NotifyPropertyChanged(“MyProduct”); } }

而且这样攻击 _CustomerLicense.MyProduct = SelectedLicense。产品;

这是怎样的产品清单充满 公共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; 
    } 

没有任何运气。 问候

回答

1

SelectedProduct属性应该有一个公共的二传手让你能够将它设置为当前选择的值在ComboBox

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

而对于初值被选中,你要么需要将它设置为一个Product对象,实际上是在ItemsSourcelsproducts):

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

或者你将不得不重写您的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; 
    } 
} 
+0

嗨mm8 我觉得问题在于它的组合里面有一个控件 –

+0

里面有一个控件并产品的一个新的对象,我需要在主窗口中这样设置: _CustomerLicense.SelectedProduct = new Product(SelectedLicense.Product.Name,SelectedLicense.Product.ProductId); 我认为这是我的问题。 Im填充组合获取数据库的产品并创建一个新对象Product,许可证对象的原始数据是一个IProduct,因为它的接口无法分配 –

+0

您是否试图按照我的建议覆盖Equals方法? – mm8

0

我固定这样的:

我创建的方法:

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

所以,我设置了组合框

<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

相关问题