如何使用组合框绑定数据

本文关键字:绑定 数据 组合 何使用 | 更新日期: 2023-09-27 18:25:34

我需要知道如何以最简单的形式将数据(字符串列表)绑定到XAML中的组合框,而不使用代码后面的ComboBox.ItemSource=object

我的意思是:

{Binding Path="What Comes here"}

假设我有:

class Window1 : UserControl {
     List<String> list = new List<String>();// And assign Value to this list
...}

我试过

{Binding Path=list} or {Binding list}

但没有任何约束。那么应该如何做呢?(我无法访问代码后面的这个组合框,因为Microsoft已将SilverLight DatGrid限制到我无法访问的程度

如何使用组合框绑定数据

很少有绑定规则可以正常工作:

  1. 只能绑定公共属性(至少对于实例对象),而不能绑定字段
  2. Be默认绑定引擎在应用绑定的控件的DataContext中查找属性路径
  3. 如果要绑定到DataContext中不存在的属性(或者DataContext未设置为控制),请使用RelativeSource标记扩展来指导绑定引擎解析属性路径

回到你的问题陈述,你需要绑定到代码背后创建的列表,你必须对代码进行以下更改:

// Not sure why you termed it as Window1 if it's actually an UserControl.
public partial class Window1 : UserControl
{
    public Window1()
    {
        InitializeComponent();
        MyStrings = new List<string>(new[] { "A", "B", "C", "D" });
        DataContext = this; // Rule #2
    }
    public List<string> MyStrings { get; set; } // Rule #1
}

XAML:

<ComboBox ItemsSource="{Binding MyStrings}"/>

如果您没有在UserControl的构造函数中设置DataContext,并且仍然希望绑定到属性,请使用RelativeSource(规则#3)进行绑定

<ComboBox ItemsSource="{Binding MyStrings, RelativeSource={RelativeSource FindAncestor
                                       , AncestorType=UserControl}}"/>

附加积分

  1. 如果您希望在初始化后向列表中添加更多项目并希望UI相应更新,请使用ObservableCollection<string>代替List<string>
  2. 点击此处阅读有关MVVM的更多信息-了解MVVM模式的基本知识。通常,所有绑定内容都保留在单独的类ViewModel中,这样就可以在不依赖UI内容的情况下对其进行测试

看看这里:模型视图视图模型(MVVM)解释

我不是SilverLight的开发人员,但据我所知,这只是完整wpf的一个精简版本。

尝试使用ViewModel并在其中定义您的列表。然后您可以将ComboBox.ItemsSource属性绑定到它:

public class SomeViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> listOfAwesomeStrings;
    public ObservableCollection<string> ListOfAwesomeStrings
    {
        get { return listOfAwesomeStrings; }
        set
        {
            if (value.Equals(listOfAwesomeStrings))
            {
                return;
            }
            listOfAwesomeStrings= value;
            OnPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

这样设置视图的DataContext,并填写您的列表:

var viewModel = new SomeViewModel();
viewModel.ListOfAwesomeStrings = new ObservableCollection<string>();
viewModel.ListOfAwesomeStrings.Add("Option 1");
viewModel.ListOfAwesomeStrings.Add("Option 2");
viewModel.ListOfAwesomeStrings.Add("Option 3");
this.DataContext = viewModel;

最后在xaml:中绑定到您的属性

<ComboBox ItemsSource="{Binding ListOfAwesomeStrings}" />