【问题标题】:How to bind data with combobox如何使用组合框绑定数据
【发布时间】:2014-10-04 00:39:26
【问题描述】:

我需要以最简单的形式了解如何在不使用 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 限制在一定程度上 我无法做到)

【问题讨论】:

    标签: c# wpf xaml silverlight combobox


    【解决方案1】:

    绑定正常工作的一些规则:

    1. 您只能与 公共属性 (至少对于实例对象) 进行绑定,而不能与字段进行绑定。
    2. 默认绑定引擎在 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. 使用ObservableCollection&lt;string&gt; 代替List&lt;string&gt;,以防您想在初始化后向列表中添加更多项目并希望UI 进行相应更新。
    2. 在此处阅读有关 MVVM 的更多信息 - Understanding the basics of MVVM pattern。通常,所有绑定内容都保留在单独的 ViewModel 类中,因此可以在不依赖任何 UI 内容的情况下对其进行测试。

    【讨论】:

      【解决方案2】:

      请看这里: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}" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-02
        • 2012-01-24
        • 2017-11-16
        • 2013-04-23
        • 1970-01-01
        • 2011-05-17
        • 2014-10-05
        • 2011-02-01
        相关资源
        最近更新 更多