【问题标题】:Binding to WPF Combo Box绑定到 WPF 组合框
【发布时间】:2017-01-23 19:52:11
【问题描述】:

我有一个想要绑定组合框的模型类。我的计划是拥有一个具有两个属性的对象。 1) 一个 ObservableCollection,其中包含我要填充组合框的项目。 2) 一个字符串属性,用于存储所选项目的值。我似乎无法让它发挥作用并接受建议。我正在尝试尽可能地遵循 MVVM。我观察到的行为是一个空的组合框。

这个类看起来像这样。

    public class WellListGroup : Notifier
{

    private ObservableCollection<string> _headers;

    public ObservableCollection<string> headers
    {
        get { return this._headers; }
        set { this._headers = value; OnPropertyChanged("headers"); }
    }

    private string _selected;

    public string selected
    {
        get { return this._selected;}
        set { this._selected = value; OnPropertyChanged("selected");}
    }

}

通知程序看起来像:

public class Notifier : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


}

}

我的视图模型调用了一个数据访问层,该层创建了我希望绑定到的以下对象。

public class MainViewModel :  Notifier
{
    public static getWells gw = new getWells();
    public static ObservableCollection<string> headers = gw.getHeaders();


    public WellListGroup wlg = new WellListGroup {headers = headers, selected = null};


}

数据访问层 - getHeaders()

public ObservableCollection<string> getHeaders()
{
    ObservableCollection<string> vals = new ObservableCollection<string>();
    WVWellModel wvm = new WVWellModel();

    var properties = getProperties(wvm);

    foreach (var p in properties)
    {
        string name = p.Name;
        vals.Add(name);
    }


    return vals;

}

然后是视图:

<ComboBox DockPanel.Dock="Top" ItemsSource = "{Binding Path = wlg.headers}" SelectedItem="{Binding Path = wlg.selected}"></ComboBox>

查看后面的代码(设置数据上下文的位置)

public partial class MainView : Window
    {
        public MainView()
        {
            InitializeComponent();
            MainViewModel mvm = new MainViewModel();
            DataContext = mvm;
        }
    }

App.xaml.cs

public partial class App : Application
{
    private void OnStartup(object sender, StartupEventArgs e)
    {
        Views.MainView view = new Views.MainView();
        view.Show();
}

private void APP_DispatcherUnhandledException(object sender,DispatcherUnhandledExceptionEventArgs e)
{
    MessageBox.Show(e.Exception.Message);
    e.Handled = true;
}

}

我已经尝试了几次迭代,但我一生都无法让它发挥作用。我看到一个空的组合框。

【问题讨论】:

标签: c# wpf combobox


【解决方案1】:

我将假设 DataContext 在视图上设置为 MainViewModel。

我认为你的列表组应该致电OnPropertyChanged

public class MainViewModel :  Notifier
{
    public static getWells gw = new getWells();
    public static ObservableCollection<string> headers = gw.getHeaders();

    private WellListGroup _wlg = new WellListGroup {headers = headers, selected = null};
    public WellListGroup wlg 
    {
        get { return _wlg; }
        set { _wlg = value; OnPropertyChanged("wlg"); }
}

组合框绑定应如下所示:

<ComboBox 
    ItemsSource = "{Binding wlg.headers}" 
    SelectedItem = "{Binding wlg.selected Mode=TwoWay}"
/>

如果这些都不起作用,我会确保 MainViewModel 被实例化并分配给 Page 构造函数中的 DataContext 或页面加载事件。

这是一个代码项目教程,可能有助于分解绑定过程Step by Step WPF Data Binding with Comboboxes

【讨论】:

  • DataContext 确实设置为 MainViewModel。上述更改仍然会产生一个空白组合框。
  • @LCaraway 实例化视图模型可能有问题。绑定可能在填充列表之前发生。
  • 如何确保在填充列表后发生绑定?
  • 您正确的地方在于需要添加 OnPropertyChanged。我没有在您的回答中看到该编辑。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-18
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多