如何使用组合框绑定数据

时间:2014-10-04 00:39:26

标签: c# wpf xaml silverlight combobox

我需要以最简单的形式知道如何将数据(字符串列表)绑定到 XAML 中的一个ComboBox ,而不使用< 代码中的strong> 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限制在某种程度,我无法做到这一点)

2 个答案:

答案 0 :(得分:1)

  

绑定工作正常的规则很少:

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

  4. 回到您需要绑定到后面代码中创建的List的问题陈述,您必须对代码进行以下更改:

    // 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并仍想绑定到property,请使用RelativeSource 绑定(规则#3)

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

    其他要点

    1. 如果您想在初始化后向列表中添加更多项目并希望相应地更新UI,请使用ObservableCollection<string>代替List<string>
    2. 在此处阅读有关MVVM的更多信息 - Understanding the basics of MVVM pattern。通常所有绑定的东西都保留在单独的ViewModel类中,这样就可以测试它对UI内容的依赖性。

答案 1 :(得分:-1)

请查看此处:Model-View-ViewModel (MVVM) Explained

我不是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}" />