目前我尝试用WPF构建类似的东西!屏幕截图:http://i.imgur.com/5G6xBTu.png
我的“Wecker”对象有一个ObservableCollection。我想动态地将项目添加到列表框中,使用类似于截图的DataBinding。到目前为止每次尝试都失败我需要在XAML文件中设置什么?
public static ObservableCollection<Wecker> WeckerCollection = new ObservableCollection<Wecker>();
public ObservableCollection<Wecker> MyWeckerCollection
{
get { return WeckerCollection; }
}
Wecker Class
public class Wecker
{
public ArrayList dayOfWeek { get; set; }
public DateTime Alarm { get; set; }
public bool activated { get; set; }
public bool loop { get; set; }
public int maxRunTime { get; set; }
public int id { get; set; }
public bool schlummern { get; set; }
public bool antiStandby { get; set; }
public bool activateMonitor { get; set; }
public string fileName { get; set; }
public string Mp3 { get; set; }
public string Message { get; set; }
public bool ShowMessage { get; set; }
public int volume { get; set; } }
我最后一次尝试了:
<ListBox HorizontalAlignment="Left" Height="392" VerticalAlignment="Top" Width="431" Margin="15,89,0,0" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemsSource="{Binding MyWeckerCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding activated, Mode=TwoWay}" />
<Label Content="{Binding Alarm}" />
<Label Content="{Binding dayOfWeek}" />
<Label Content="{Binding Message}" />
<Label Content="{Binding Mp3}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:4)
我怀疑你没有设置DataContext
在ctor中设置DataContext
this.DataContext = this;
或者您可以在窗口(顶部)部分的XAML中执行此操作
DataContext="{Binding RelativeSource={RelativeSource self}}"
如果你已经设置了DataContext,那么它应该起作用 你确定它在Windows部分
尝试(但Path是默认属性,因此不应该是一个问题)
ItemsSource="{Binding Path=MyWeckerCollection}"
这可能是你的问题 - 公共静态?
公共静态的目的是什么?
public static ObservableCollection<Wecker> WeckerCollection = new ObservableCollection<Wecker>();
如果你想使用支持属性,那么就这样做
private ObservableCollection<Wecker> myWeckerCollection = new ObservableCollection<Wecker>();
public ObservableCollection<Wecker> MyWeckerCollection
{
get { return myWeckerCollection ; }
}
答案 1 :(得分:3)
听起来您的DataContext
设置不正确。
您说您将DataContext
绑定到{Binding RelativeSource={RelativeSource Self}}
,但这只会将DataContext
绑定到UI对象本身。
例如,
<Window DataContext="{Binding RelativeSource={RelativeSource Self}}">
会将DataContext
设置为Window对象,但是类Window
没有名为MyWeckerCollection
的属性,因此绑定会失败。
如果你有
<local:MyCustomWindow DataContext="{RelativeSource={RelativeSource Self}}">
和MyCustomWindow
有一个名为MyWeckerCollection
的属性,然后就可以了。
我还看到your comment here声明:
我根本没有获得任何数据,我检查了对象,&#34; WeckerCollection&#34;它将数据设置为DataContext
这让我相信
A)MyWeckerCollection
不是UI控件,在这种情况下,您需要将DataContext
绑定更新为Self
以外的其他内容,以便它正确绑定到包含{{1}的对象而不是UI对象。
B)或者,当您将MyWeckerCollection
设置为DataContext
时,可以阅读此评论,当然,课程MyWeckerCollection
本身不具有名为{{1}的属性},所以绑定会失败。
因此问题的根本原因是ObservableCollection<Wecker>
未正确设置。
很遗憾,您提供的信息不足以帮助我们确定设置MyWeckerCollection
的正确方法,但是如果您能为我们提供more information我很乐意帮助你。
Visual Studio的绑定错误和/或调试模式通常足以指出您正确的方向来修复DataContext
,或者有一些第三方工具,例如Snoop我强烈建议您调试绑定错误。
此外,如果你是WPF的新手(听起来像你),并且正在努力理解DataContext
的目的以及它是如何运作的,我建议写博客文章我为初学者写的:What is this "DataContext" you speak of?。如果您要使用WPF,了解DataContext
非常重要。 :)
答案 2 :(得分:-4)
尝试将ItemSsource添加到ListBox并像这样更改Xaml: 代码背后:
this.YourList.ItemsSource = WeckerCollection;
Xaml:
<ListBox HorizontalAlignment="Left" Height="392" VerticalAlignment="Top" Width="431" Margin="15,89,0,0" ScrollViewer.VerticalScrollBarVisibility="Visible">