WPF ObservableCollection不会绑定到ListBox

时间:2014-07-16 16:01:10

标签: c# wpf xaml listbox

我有一个ObservableCollection作为我班级的成员。当点击一个按钮显示下一个屏幕时,这个可观察的集合从数据库中填充,然后我希望可观察集合中的所有项目都显示在列表框中。

这是我的代码:

//Inside My UiPageData class
public ObservableCollection<string> _SavedMachines = new ObservableCollection<string>();

    public ObservableCollection<string> SavedMachines
    {
        get { return _SavedMachines; }

        set
        {
            _SavedMachines.Add(value.ToString());
            NotifyPropertyChanged("SavedMachines");
        }
    }  

public void EventClick()
    {
        if (Instance.CurrentPage != UiPageEnum.eVechWizardScreen)
        {
            Instance.AdvancedSettings.CurrentWizardScreen = VehicleWizardEnum.eLoadVehicle;

            DataManager vechDM = DataManager.getDataManager();
            vechDM.close();
            vechDM.open("Path to DB");

            DataManagement.Machines[] machs = vechDM.getMachines();
            if (machs.Length > 0)
            {
                _SavedMachines.Clear();
                for (int i = 0; i < machs.Length; i++)
                {
                    _SavedMachines.Add(machs[i].Name);
                    Debug.WriteLine(machs[i].Name);
                }

            }
        }
        Instance.CurrentPage = UiPageEnum.eVechWizardScreen;
    }

我可以从Debug输出中看到有3个项目已加载到我的Observable Collection中。

然后XAML看起来像这样:

<TextBlock Text="Current Vehicles"
            Style="{StaticResource HeaderStyle}" />
<ListBox Grid.Row="1"
            Grid.ColumnSpan="2"
            ItemsSource="{Binding UiPageData.SavedMachines}">
    <ListBox.Resources>
        <Style TargetType="ListBox"
                BasedOn="{StaticResource WgListBox}">
            <Setter Property="ListBox.IsEnabled"
                    Value="True" />
        </Style>
    </ListBox.Resources>
</ListBox>

我对此非常困惑,因为ListBox中没有显示任何内容。我是C#和WPF以及Windows的新手,试图找出如何对现有代码进行更改。我们将非常感激地提供任何帮助。

3 个答案:

答案 0 :(得分:2)

首先,这样做:

private ObservableCollection<string> _SavedMachines = new ObservableCollection<string>();
public ObservableCollection<string> SavedMachines
{
    get { return _SavedMachines; }
}

其次,你的DataContext很可能是错误的。您需要弄清楚DataContext所控制的ListBox是什么。我的猜测是DataContext是:

  1. 您的DataContext未设置
  2. UiPageData是您DataContext的意思,您需要ItemsSource="{Binding SavedMachines}"
  3. 您的DataContext设置完全不同,我们无法真正帮助您
  4. 您应该使用Visual Studio的Output窗口和/或Snoop等工具来确定绑定问题。

    此外,ObservableCollection<string>似乎有点无用。我建议您在某些时候public ObservableCollection<DataManagement.Machines> SavedMachines,然后指定ListBox.ItemTemplate使用DataTemplate按照您希望的方式显示DataManagement.Machines对象。

答案 1 :(得分:0)

您的SavedMachines实施看起来不对。

您应该添加到SavedMachines而不是_SavedMachines

ObservableCollection不需要OnPropertyChanged。您的财产的实施应该只是

public ObservableCollection<string> SavedMachines{get;set;}

答案 2 :(得分:-1)

我同意克里希纳的观点。您的ObservableCollection应如下所示:

protected ObservableCollection<string> _SavedMachines = new ObservableCollection<string>();
public ObservableCollection<string> SavedMachines
{
    get { return _SavedMachines; }
    set
    {
        if (_SavedMachines != value) 
        {
          _SavedMachines = value;
          NotifyPropertyChanged("SavedMachines");
        }
    }
}