繁体   English   中英

ObservableCollection或List数据是否使用MVVM与comboBox绑定?

[英]ObservableCollection or List data bind with comboBox using MVVM?

我有ObservableCollection项目,我想将此数据绑定到我的comboBox。 如何用comboBox绑定数据? 我正在使用MVVM模式,因此建议我如何使用MVVM模式绑定数据

我正在尝试执行此代码,但无法正常工作。 在我的XAML页面中:

<ComboBox x:Name="comobo1" 
          DisplayMemberPath="CardTypeName" 
          SelectedValuePath="CardTypeID" 
          ItemsSource="{Binding Path=combodata}">    
</ComboBox>

在我的ViewModel中
Card是我的模特)

 public ObservableCollection<Card> combodata = new ObservableCollection<Card>();
 foreach (var item in App.db.States)
 {
     Card c = new Card(item.StateName, item.StateID);
     combodata.Add(c);
 }

如何将此组合数据绑定到我的comboBox-我在做什么错?

首先:您的combodata具有private访问修饰符,而不是public 第二点: combodata必须是属性,而不是field 并且最好将INotifyPropertyChanged实现添加到您的类中。

您必须绑定到应该实现INotifyPropertyChanged的视图模型的公共属性。

这是您应该做的:

视图:

<ComboBox x:Name="comobo1" DisplayMemberPath="CardTypeName" SelectedValuePath="CardTypeID" ItemsSource="{Binding Path=ComboData}" />

ViewModel:

public class MyViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<Card> comboData;

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<Card> ComboData
        {
            get
            {
                return this.comboData;
            }

            set
            {
                if (this.comboData != value)
                {
                    this.comboData = value;
                    this.NotifyPropertyChanged("ComboData");
                }
            }
        }

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }

编辑 :您还需要设置视图的DataContext属性。 简单的方法是将ViewModel的实例影响到视图代码背后的DataContext属性。

private ObservableCollection<Card> _combodata;
Public ObservableCollection<Card> comboData
{
   get
   {
      if (_combodata == null)
         _combodata = new ObservableCollection<Card>();
      return _combodata;
   }
   set
   {
       if (value != _combodata)
           _combodata = value;
   }
}


<ComboBox x:Name="comobo1" 
      DisplayMemberPath="CardTypeName" 
      SelectedValuePath="CardTypeID" 
      ItemsSource="{Binding Path=comboData}">    
</ComboBox>

并且不要忘记设置DataContext属性。

代码存在以下问题。

1.您不能绑定到私有字段或属性。 它应该是公共财产。

2.您仅提供了ItemsSource="{Binding Path=combodata}"但没有提供源。 组合数据来自哪里?

ObservableCollection无关,除非您的组合框项目一旦填充就不会更改。 在这种情况下,列表可以很好地工作。

要使其正常工作,请将您的组合数据更改为

public ObservableCollection<Card> combodata {get;set;}

然后,

<ComboBox x:Name="comobo1" 
          DisplayMemberPath="CardTypeName" 
          SelectedValuePath="CardTypeID" 
          ItemsSource="{Binding Path=combodata}" ElementName=mainWindow>    
</ComboBox>

通过指定ElementName,您将告诉WPF绑定引擎查找mainWindow类的combodata属性。

我希望这有帮助。

我最好的猜测是您的ComboBox的DataContext未设置为ViewModel的实例

我经常使用Snoop来调试应用程序的DataContext问题。 它允许您查看您的可视树,并查看所有控件的DataContext。

DataContext是您的UI绑定到的数据。 通常,将DataContext设置在可视树中较高的位置,例如在Window对象上,但作为示例,下面的代码行会将ComboBox的DataContext设置为ViewModel的新实例,然后ComboBox应该能够找到绑定到它的combodata集合。

comobo1.DataContext = new MyViewModel();

另外,将combodataField (无get / set访问器方法)更改为Property (有关示例,请参见Dmitriy的答案

您需要绑定到公共财产。 在您的示例中,combodata是私有的。

正确答案是:

在XAML PAGE中:

<CollectionViewSource x:Key="comboBoxCollection" Source="{Binding comboData}"></CollectionViewSource>
  <DataTemplate x:Key="ComboBoxDataTemplate">
            <Grid MinHeight="25">
                <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                  <ComboBox x:Name="comobo1" DisplayMemberPath="CardTypeName"   SelectedValuePath="CardTypeID" ItemsSource="{Binding Source={StaticResource comboBoxCollection }}">
                    </ComboBox>
            </Grid>
         </DataTemplate>

在ViewModel中:

 private ObservableCollection<Card> _combodata;

        public ObservableCollection<Card> comboData
        {
            get
            {
                if (_combodata == null)
                    _combodata = new ObservableCollection<Card>();
                return _combodata;
            }
            set
            {
                if (value != _combodata)
                    _combodata = value;
            }
        }

  if (_objCardField.FieldTag == "State") 
                {
                    cards = new Cards();
                    foreach (var item in App.db.States)
                    {
                        Card c = new Card(item.StateName, item.StateID);
                        comboData.Add(c);
                    }
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM