绑定到列表框的对象不起作用

时间:2014-05-21 16:25:26

标签: c# wpf xaml listbox

目前我尝试用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>

3 个答案:

答案 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">