【问题标题】:set selectedValue of combobox设置组合框的 selectedValue
【发布时间】:2015-11-01 01:02:08
【问题描述】:

我有一个组合框“cbSkillLevel”,我将数据绑定到它,如下所示以填充列表。它工作正常。我有一个包含项目的列表框,根据我需要为“cbSkillLevel”设置不同值的项目选择。如何将组合框的值设置为我想要的值。

我试过的如下。

非常感谢您的帮助。

 <ComboBox Grid.Column="3" x:Name="cbSkillLevel" Margin="0,0,10,0" IsEnabled="{Binding ElementName=SkillsPage, Path=setIsEnabled, Mode=OneWay}">
     <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock FontSize="26" Foreground="Black" Text="{Binding Value}" />
        </DataTemplate>
     </ComboBox.ItemTemplate>
 </ComboBox>

List<Lookup> skillLevel = dbOperation.getLookupData("Skill_Level");
cbSkillLevel.ItemsSource = skillLevel;


private void lbSkills_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   clearFields();
   clearTopicsForm();
   var skillobj = (lbSkills.SelectedItem as Skill);

   if (skillobj != null)  
   { 
       selected_SkillDescription = skillobj.SkillDescription;
       tbNotes.Text = skillobj.Notes;
       tbDescription.Text = selected_SkillDescription;
       /*I TRIED THE BELLOW OPTION BUT DID NOT WORK.*/
       //cbSkillLevel.SelectedItem = skillobj.SkillLevel;
       //cbSkillLevel.SelectedIndex = cbSkillLevel.Items.IndexOf(skillobj.SkillLevel.ToString());                
       //cbSkillLevel.SelectedIndex = 1;
       //cbSkillLevel.ItemsSource = tempListSkillLevel;
       cbSkillLevel.SelectedValue = skillobj.SkillLevel.ToString();
       cbSkillType.SelectedItem = skillobj.SkillType;
       tbWarningWeeks.Text = skillobj.WarningWeeks.ToString();
       dpValidFrom.Date = skillobj.ValidFrom;
       dpValidUntil.Date = skillobj.ValidUntil;
       /*load topics for this skill*/
       loadTopicsFromDB(skillobj.SkillDescription);
       //set the fields as read only
       setIsEnabled = false;
       addEditButton();            
     }
  }

我虽然使用'cbSkillLevel.SelectedValue = Skillobj.SkillLevel.ToString();'应该工作,但它没有。我的猜测是因为绑定设置为值'Value'

<TextBlock FontSize="26" Foreground="Black" Text="{Binding Value}" />

在设置我从 Skill 对象分配的值时。如何设置值 'cbSkillLevel.SelectedValue = Skillobj.SkillLevel.ToString();'

class Skill 
{
    [SQLite.PrimaryKey,   SQLite.AutoIncrement]
    public int Id { get; set; }
    public string SkillDescription { get; set; }
    public string SkillType { get; set; }
    public string SkillLevel { get; set; }
    public DateTime ValidFrom { get; set; }
    public DateTime ValidUntil { get; set; }
    public int WarningWeeks { get; set; }
    public string Notes { get; set; }
}

class Lookup
{
    [SQLite.PrimaryKey, SQLite.AutoIncrement]
    public int LookupId { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
}

【问题讨论】:

    标签: c# wpf xaml data-binding combobox


    【解决方案1】:

    SelectedItem 可能不起作用,因为对象是不同的物理对象,在单独的列表中创建。 您使用 {Binding Value} 不是问题,这只是对象的视觉表示,与选择无关。您需要做的是告诉组合框 WHAT 值是该对象上的“SelectedValue”。这是在 XAML 中完成的,并且建议使用 Value,因为这与您的对象相结合(?)

    <ComboBox SelectedValuePath="Value" ...
    

    那么这应该可以工作:

    cbSkillLevel.SelectedValue = skillobj.SkillLevel.Value;
    

    【讨论】:

    • Hi 'Value' 不是两个对象独有的,在 Lookup 对象中它的'Value' 和在 Skill 中它是'SkillLevel'。这就是为什么我不知道该怎么做
    • 嗯,LookupId 是那个标识符吗?它们有什么不常见的,或者如果需要创建一个新属性(可以包含来自其他属性的数据,只读)。并在我的两个代码 sn-ps 上使用它而不是“值”。
    • 它们之间没有共同的键,我不能添加任何属性,因为这将是表结构。
    • SkillLevel 类的外观如何?以及它如何映射到 Lookup,如果它们“相同”,哪些值是相同的?
    • 嗨,没有 SkillLevel 类,有 Skill 类和 Lookup 类。我将组合框的项目源设置为查找中的数据。在设置 selectedValue 时,我尝试从 SkillLevel 的 Skill 对象中设置,该对象的 SkillLevel 等于 Lookup 对象中的项目之一。
    【解决方案2】:

    ItemSource 是一个查找列表,因此设置“已选择”的唯一方法也必须是查找类型。

    cbSkillLevel.SelectedValue = skillobj.SkillLevel.ToString();
    

    这只有在您已经使用

    建立了 ItemSource 时才有效
    IEnumerable<string>
    

    ComoboBox 是一个 ItemsControl。你可以在这里查看详细信息https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol(v=vs.110).aspx

    【讨论】:

    • 在选定的更改中,我采用了另一个查找类型的列表(正在查找的一个组合框)并从 SkillObj 添加了“值”字段。然后我尝试设置选定的值,但仍然无法正常工作。像这样的 List tempListSkillLevel = new List(); tempListSkillLevel.Add(new Lookup { Value = Skillobj.SkillLevel });然后 cbSkillLevel.SelectedValue = tempListSkillLevel[0];但始终 selectedvalue 显示为 null
    【解决方案3】:

    将 DisplayMemberPath 和 SelectedValuePath 添加到您的 xaml 绑定中,即 DisplayMemberPath 是对象的什么属性应该显示给用户,而 SelectedValuePath 是它在内部选择的属性,因此例如如果我想将我的水果集合绑定到组合框,我想显示水果名称,但选择它的 ID,所以我的属性将是

     DisplayMemberPath = "FruitName"
     SelectedValuePath = "FruitId"
    

    稍后在您的 selectionchanged 事件中,您可以使用 cbSkillLevel.SelectedValue 设置其值。在我们的示例中,它将是水果 id,因为我们将其绑定为 SelectedValuePath。

    【讨论】:

    • 在选定的更改中,我采用了另一个查找类型的列表(正在查找的一个组合框)并从 SkillObj 添加了“值”字段。然后我尝试设置所选值但仍然无法正常工作。像这样 List tempListSkillLevel = new List(); tempListSkillLevel.Add(new Lookup { Value = Skillobj.SkillLevel });然后 cbSkillLevel.SelectedValue = tempListSkillLevel[0];但始终 selectedvalue 显示为 null
    • 嗨,在您的示例中,FruiName 和 FruitId 属于同一个 obj?在我的情况下,对象查找的 itemSource 和我尝试设置的 selectedValue 是不同的对象 SKill。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2011-02-21
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多