【问题标题】:Bind an Existing Object to a ComboBox in WPF C# MVVM将现有对象绑定到 WPF C# MVVM 中的组合框
【发布时间】:2017-09-06 13:40:14
【问题描述】:

我正在尝试使用ComboBox 绑定到CostCodes 列表。一条名为SelectedRecord 的记录被传入以进行编辑,我希望发生两件事。首先,我希望ComboBox 选择已经应用于SelectedRecordCostCode。然后,我希望用户能够编辑 CostCode,以便他们可以将 SelectedRecord 分配给其他用户。

我已经成功地将我的ComboBox 绑定到ObservableCollection<CostCode>,但是当用户加载Window 时,已经分配给SelectedRecordCostCode 不会在ComboBox 中自动选择。这是 XAML:

<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding SelectedRecord.Provider}"/>
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding SelectedRecord.Number}"/>
<ComboBox Grid.Row="5" Grid.Column="1" 
            ItemsSource="{Binding AllCostCodes}"
            DisplayMemberPath="Text">
</ComboBox>

我尝试过使用SelectedValueSelectedValuePath,但没有成功。尽管用户能够编辑并且当用户单击ComboBoxCostCodes 正确显示,但已分配给SelectedRecordCostCode 不会显示。我包含了几个 TextBoxes 来展示我如何绑定到它们,我实际上想对它们的 Text 属性做同样的事情,但用 ComboBox 代替。

编辑:CostCode.cs

public partial class CostCode
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public CostCode()
    {
        this.PhoneRecords = new HashSet<PhoneRecord>();
    }

    public int Id { get; set; }
    public string Text { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<PhoneRecord> PhoneRecords { get; set; }
}

PhoneRecord.cs

public partial class PhoneRecord
{
    public int Id { get; set; }
    public Nullable<System.DateTime> DateGiven { get; set; }
    public string PersonName { get; set; }
    public Nullable<int> PhoneModelId { get; set; }
    public Nullable<bool> NMU { get; set; }
    public string IMEI { get; set; }
    public string Number { get; set; }
    public Nullable<int> CostCodeId { get; set; }
    public Nullable<System.DateTime> DateReturned { get; set; }
    public string WhyReturned { get; set; }
    public string Solution { get; set; }
    public string Internet { get; set; }
    public string Provider { get; set; }
    public string SpeedDial { get; set; }
    public string OnDatabases { get; set; }
    public string Notes { get; set; }

    public virtual CostCode CostCode { get; set; }
    public virtual PhoneModel PhoneModel { get; set; }
}

SelectedRecordDataGridPhoneRecords 中选择,然后传递给EditWindow,我想在其中设置适用的CostCode

【问题讨论】:

  • SelectedRecord.CostCode 是什么类型?是 CostCode 类吗? CostCode 类的成员有哪些?
  • SelectedRecord 的类型为 PhoneRecordCostCode 的类型为 CostCode。每个PhoneRecord 都分配有一个CostCode
  • CostCode 类的成员有哪些?
  • IdText 是属性。
  • 请将您的代码发布到设置 SelectedRecord 的位置以及所有相关类型。

标签: c# wpf mvvm combobox


【解决方案1】:

我认为您需要使用 SelectedItem
像这样的:

<ComboBox Grid.Row="5" Grid.Column="1" 
            ItemsSource="{Binding AllCostCodes}"
            DisplayMemberPath="Text"
            SelectedItem="{Binding SelectedRecord.CostCode}">
</ComboBox>

编辑: 正如 Spongebrot 和 Ed Plunkett 在 cmets 中所说:如果它不是 CodeCode 对象的同一个实例,那么您需要覆盖 CostCode 对象的 Equals 方法。
(在此编辑中,我还根据您问题中的 cmets 将绑定从“SelectedRecord”更改为“SelectedRecord.CostCode”。)

编辑 2: 您可以在 MSDN 阅读有关覆盖 Equals 的信息。
在你的情况下,我认为应该是这样的:

class CostCode
{
    //... property definition of Id and Text


    public override bool Equals(System.Object obj)
    {
        // If parameter is null return false.
        if (obj as  == null)
        {
            return false;
        }

        // If parameter cannot be cast to CostCode return false.
        CostCode cc = obj as CostCode;
        if (cc == null)
        {
            return false;
        }

        // Return true if the Id fields match:
        return Id == cc.Id;
    }

    public override int GetHashCode()
    {
        return Id; // If Id is int...
    }
}

【讨论】:

  • 不幸的是它仍然没有绑定。即使我这样做 {SelectedRecord.CostCode}
  • 您是否尝试过覆盖 CostCode 类的 Equals 方法并将绑定模式设置为 TwoWay?
  • @Spongebrot 绑定方式默认为 TwoWay。但你可能是对的,他有两个不同的“相同”成本代码实例。
  • 感谢您的回答。我有一个CostCode,它位于PhoneRecord 上,然后是ComboBox,它填充了CostCode 类型的集合。我想在ComboBox 集合中选择与传递的PhoneRecord 上的CostCode 相关的CostCode。我需要重写equals方法来做到这一点吗?我会以什么方式覆盖它?
  • CostCode 必须具有某种独特的属性或属性组合。如果它只是一个单一的属性,比如让我们说一个 Id,您还可以使用 SelectedValue 和 SelectedValuePath,其中 SelectedValue 的绑定将指向所选 CostCode {Binding SelectedRecord.CostCode.Id} 的 Id,而 SelectedValuePath 将是“Id” .如果它是 name+value 等属性的组合,则必须重写 Equals 方法,该方法仅比较两个对象,如果它们相同则返回 true。
猜你喜欢
  • 2015-04-27
  • 2015-09-15
  • 1970-01-01
  • 2017-06-20
  • 2021-10-11
  • 2015-07-11
  • 2013-10-04
  • 1970-01-01
  • 2015-08-20
相关资源
最近更新 更多