我有一个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的新手,试图找出如何对现有代码进行更改。我们将非常感激地提供任何帮助。
答案 0 :(得分:2)
首先,这样做:
private ObservableCollection<string> _SavedMachines = new ObservableCollection<string>();
public ObservableCollection<string> SavedMachines
{
get { return _SavedMachines; }
}
其次,你的DataContext很可能是错误的。您需要弄清楚DataContext
所控制的ListBox
是什么。我的猜测是DataContext
是:
DataContext
未设置UiPageData
是您DataContext
的意思,您需要ItemsSource="{Binding SavedMachines}"
DataContext
设置完全不同,我们无法真正帮助您您应该使用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");
}
}
}