WPF组合框 - 预选项目

时间:2011-02-25 22:19:45

标签: wpf wpf-controls binding wpfdatagrid wpftoolkit

我想从itemssource预先选择一个组合框,(选择一个现有项目)。这是我的类模型和xaml语法。

Class ViewModelSample
{
 Public List<Animal> Animals;
 Public LivingBeing  LivingBeingInst {get; set;}
}

Class LivingBeing
{
  Public Animal AnimalInst {get; set;} 
}

--------------------------------------------------------------------
<Combobox ItemsSource={Binding Animals} SelectedItem={Binding LivingBeingInst.AnimalInst}
 DisplayMemeber = SomePropertyInAnimal>
--------------------------------------------------------------------------

但这不起作用。我想要的是,当xaml出现时,我需要使用SelectedItem中给出的项目预先选择组合框。

非常感谢任何帮助。谢谢,玛尼

4 个答案:

答案 0 :(得分:3)

感谢您的投入,我已经解决了这个问题。我已经实现了INotifyPropertyChanged,但这不是问题。

组合框的SelectedItem应该是ItemsSource中给出的Collection之一。虽然,AnimalInst属于Animal类型,但它不是te ItemsSource中的对象之一。所以我所做的是,声明一个SelectedAnimal属性,将其绑定到SelectedItem。 'SelectedAnimal'将从比较AnimalInst.Name的'Animals'集合返回相同的实例。一个例子如下。 (时间表是集合)。

 private ISchedule _selectedSchedule;
       public ISchedule SelectedSchedule
        {
            get
            {
                if(_selectedSchedule != null)
                {
                    var schedule = this.Schedules.Where(item => item.GlobalCodesId == _selectedSchedule.GlobalCodesId).FirstOrDefault();
                    return schedule;
                }
                return _selectedSchedule;
            }
           set 
           { 
               _selectedSchedule = value;
               base.NotifyPropertyChanged("SelectedSchedule");
           }
        }

答案 1 :(得分:2)

通常情况下,您的ViewModel和SelectedAnimal属性都有一个List(在您的情况下为Animal),在您的情况下,似乎LivingBeingInst属性应该是列表中的选定动物。

要使这样的东西起作用,你可能需要编写一些代码来将LivingBeing转换为动物并通过ValueConverter返回。

但是,我认为最好的办法是创建一个SelectedAnimal属性来存储选定的Animal。

在您的构造函数中,或者您最初填充动物列表的任何位置,您可以将SelectedAnimal设置为列表中的第一个元素。

答案 2 :(得分:1)

SelectedItem的初始值需要是作为ComboBox ItemsSource成员的对象的实例。在此示例中,LivingBeingInst.AnimalInst需要位于Animals集合中。

你还可以拥有一个属性,在LivingBeingInst.AnimalInst集合中找到Animals的相应项目,就像Everything Matters的答案一样。

答案 3 :(得分:0)

您没有在这些类中实施更改通知。因此,除非您已经在相应类的构造函数中填充了所有这些属性,否则绑定无法知道您已经这样做了。

至少,这是我对您发布的非工作,不可编译,非真实代码的猜测。一般来说,如果你发布实际代码,你会得到更多有用的答案,特别是如果你花时间实现现有代码的最小的最小子集,仍然表现出你试图解决的问题。 (除此之外,当你这样做时,你可能会自己找到答案。)