【问题标题】:ArgumentException when binding a ListBox to an ObservableCollection将 ListBox 绑定到 ObservableCollection 时出现 ArgumentException
【发布时间】:2014-02-12 14:17:12
【问题描述】:

首先我要补充一点,我是 Windows Phone 开发的新手,所以请放轻松 :-)

我想将一个 ListBox 绑定到一个 ObservableCollection,其中每个 LinkElement 都由一个名为 Tile 的 UserControl 表示。到目前为止,代码有效,我在 ObservableCollection 中得到了与 LinkElement:s 一样多的 Tile:s(我已经稍微简化了下面的代码,现在只有一个 LinkElement)。

XAML:

        <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="10,10,10,10">
        <ScrollViewer Name="linkScrollViewer">
            <ListBox Name="linkList" Margin="26,0,26,0" Height="380" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Controls:Tile>
                            <toolkit:ContextMenuService.ContextMenu>
                                <toolkit:ContextMenu Name="ContextMenu" >
                                    <toolkit:MenuItem Name="Edit" Header="Edit" Click="EditItem_Click"/>
                                    <toolkit:MenuItem Name="Delete"  Header="Delete" Click="DeleteItem_Click"/>
                                </toolkit:ContextMenu>
                            </toolkit:ContextMenuService.ContextMenu>
                        </Controls:Tile>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>                
        </ScrollViewer>
    </Grid>

我通过代码设置绑定源:

linkList.ItemsSource = LinkProjection.List;

以及我绑定的集合(现在没有多大作用):

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SoftTeam.SoftLink
{
 public class LinkProjection
{
    private Links _links;
    public ObservableCollection<LinkElement> List = new ObservableCollection<LinkElement>();
    public LinkProjection(Links links)
    {
        _links = links;
    }

    public void Refresh()
    {
        List.Clear(); 

        var element = new LinkElement();

        element.Name = "Button1"; 
        element.Header = "Media";
        element.Height = 200;
        element.Width = 480;
        element.IsLink = false;
        element.Tag = null;
        element.URL = "";

        List.Add(element);
    }
}

public class LinkElement
{
    public string Name;
    public string Header;
    public string URL;
    public double Height;
    public double Width;
    public bool IsLink;
    public object Tag;
}

}

问题是当我尝试将 Tile 控件的属性绑定到 LinkElement 类的属性时,我得到一个 System.ArgumentException“值不在预期范围内。”。该异常没有提示我问题出在哪里,因为它没有出现在我的代码中。

也就是说,当我改变时

<Controls:Tile> // This works!

以 XAML 为例

<Controls:Tile TileHeader="{Binding Path=Header}"> // This crashes

<Controls:Tile Name="{Binding Path=Name}">  // This crashes too

出现异常。我绑定到哪个属性都没有关系,它会给出一个异常。如果没有绑定属性,代码可以正常工作。

我想我的问题是:为什么?

【问题讨论】:

  • 我认为您应该在实现INotifyPropertyChanged 接口的模型类中使用这些属性。然后,您可以将这些属性绑定到 XAML 控件。检查此链接以获取更多信息link
  • 我将 INotifyPropertyChanged 添加到 LinkElement 类并按照您发送的链接实现它,但现在我收到 NullReferenceException:在 System.Windows 中发生“System.NullReferenceException”类型的第一次机会异常.ni.dll 附加信息:对象引用未设置为对象的实例。
  • 我现在正在调查,不确定这是否与我原来的问题有关...
  • 不,那是另一个问题,这意味着主要问题仍然存在......
  • 好的,另一个更新。 INotifyPropertyChanged 确实有效,但到目前为止仅适用于数字属性(在我的情况下为双属性)。它仍然在字符串和布尔属性上失败......

标签: c# xaml windows-phone-8


【解决方案1】:

我终于在这篇文章中找到了答案:

Binding properties of User Control in Windows Phone Application

问题是我的 UserControl 在另一个项目/程序集中,因此我需要为我的控件创建 Dependency Proeperties。

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 2012-12-16
    • 2018-09-11
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2015-08-04
    相关资源
    最近更新 更多