使用Id值绑定Combobox名称

时间:2014-07-03 09:09:35

标签: c# wpf xaml combobox

我有一个组合框控件。我从数据库中获取组合框值。我有Id和姓名。但我只在组合框中绑定了Name。我想要的是, 1.如果我在Combobox中选择任何名称,我需要在我的数据库中保存相应的ID。现在我能够绑定数据库中的值并在Combobox中显示名称。但是当我在组合框中选择任何值并尝试保存均值时,它会在ID上显示空值。这是我的代码。请帮我找一些解决方案。 Xaml:

    <ComboBox x:Name="cb_rentaltype" HorizontalAlignment="Left" Margin="150,5,0,0"    VerticalAlignment="Top" Height="35" Width="200"
                                          SelectedValue="{Binding MasterRentalType}"
                                          DisplayMemberPath="RentalTypeName"
                                          SelectedValuePath="RentalTypeId" />

我的代码背后:

        var status = new MasterRentalType();
        List<MasterRentalType> listRentalType =
                              status.Get<MasterRentalType>() as
                               List<MasterRentalType>;

        cb_rentaltype.ItemsSource = listRentalType;

我希望将Id绑定到Data上下文。这是代码,

 private void FacilityDataBind()
    {
        cb_rentaltype.DataContext = ??
    }

注意:MasterRentalType是我获取值的表。我有ID和名称值。

  public class MasterRentalType : EntityBase
     {
        public string RentalTypeId {get; set;}
        public string RentalTypeName {get; set;}       
     }

如何绑定并保存id值?

2 个答案:

答案 0 :(得分:1)

您的问题是由于您将ComboBox.SelectedValue属性绑定到MasterRentalType属性的数据而造成的,我认为该属性属于MasterRentalType类型,但您设置了SelectedValuePath属于RentalTypeId的财产。所以你说*让SelectedValue使用string RentalTypeId属性,然后将MasterRentalType数据绑定到它。

有许多解决方案。更正您的示例,您应该尝试这样做:

<ComboBox x:Name="cb_rentaltype" HorizontalAlignment="Left" Margin="150,5,0,0" 
    SelectedValue="{Binding MasterRentalType.RentalTypeId}"
    DisplayMemberPath="RentalTypeName"
    SelectedValuePath="RentalTypeId" />

或者,您可以这样做:

<ComboBox x:Name="cb_rentaltype" HorizontalAlignment="Left" Margin="150,5,0,0" 
    SelectedItem="{Binding MasterRentalType}"
    DisplayMemberPath="RentalTypeName" />

要了解有关差异的更多信息,请查看MSDN上的How to: Use SelectedValue, SelectedValuePath, and SelectedItem页面。

答案 1 :(得分:1)

有几种方法可以实现这一目标。其中一个在下面实现:

xaml应如下所示:

<ComboBox x:Name="cb_rentaltype" HorizontalAlignment="Left" Margin="150,5,0,0" 
              ItemsSource="{Binding MasterRentalTypeColl, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
              SelectedItem="{Binding SelectedMasterRentalType, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
              DisplayMemberPath="RentalTypeName">            
    </ComboBox>

MasterRentalType类:

public class MasterRentalType : EntityBase, INotifyPropertyChanged 
{
    private string _RentalTypeId;
    private string _RentalTypeName;

    public string RentalTypeId
    {
        get { return _RentalTypeId; }
        set
        {
            _RentalTypeId = value;
            NotifyPropertyChanged("RentalTypeId");
        }
    }

    public string RentalTypeName
    {
        get { return _RentalTypeName; }
        set
        {
            _RentalTypeName = value;
            NotifyPropertyChanged("RentalTypeName");
        }
    }



    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

模型类:

public class MasterRentalModel: INotifyPropertyChanged 
{
    private MasterRentalType _SelectedMasterRentalType;
    private List<MasterRentalType> _MasterRentalTypeColl = new List<MasterRentalType>();

    public MasterRentalType SelectedMasterRentalType
    {
        get { return _SelectedMasterRentalType; }
        set
        {
            _SelectedMasterRentalType = value;
            NotifyPropertyChanged("SelectedMasterRentalType");
        }
    }

    public List<MasterRentalType> MasterRentalTypeColl
    {
        get { return _MasterRentalTypeColl; }
        set { _MasterRentalTypeColl = value; }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

在代码隐藏中,您只需要将模型分配给ComboBox的DataContext;你可以实现这个任何其他功能(这里我已经在Loaded的{​​{1}}事件的事件处理程序中实现了它:

Window

每当用户更改选择时,private void Window_Loaded(object sender, RoutedEventArgs e) { MasterRentalModel masterRentalModel = new MasterRentalModel(); // Fill the list of RentalType here masterRentalModel.MasterRentalTypeColl.Add(new MasterRentalType() { RentalTypeId = "1", RentalTypeName = "Monthly" }); masterRentalModel.MasterRentalTypeColl.Add(new MasterRentalType() { RentalTypeId = "2", RentalTypeName = "Quarterly" }); masterRentalModel.MasterRentalTypeColl.Add(new MasterRentalType() { RentalTypeId = "1", RentalTypeName = "Yearly" }); cb_rentaltype.DataContext = masterRentalModel; } 都会更新。在SelectedMasterRentalType中,您可以同时获得SelectedMasterRentalTypeRentalTypeId。如果您遵循正确的绑定,您的模型将始终更新;这是WPF的精髓。

希望这会有所帮助。