我是c#的新手并尝试为我的ObsorvableCollection类实现INotifyPropertyChanged
但它给出了错误,数据没有绑定。有人请帮我解决这个问题
发生了System.ArgumentNullException类型的异常 mscorlib.ni.dll但未在用户代码中处理
Additional information: Value cannot be null.
先谢谢。
我的Xaml代码:
<Page
x:Class="App2.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.BottomAppBar>
<CommandBar Background="Orange">
<AppBarButton Icon="Sort" Label="Sort">
<AppBarButton.Flyout>
<MenuFlyout>
<MenuFlyoutItem Text="By Upvotes" Click="FilterItem_Click" Tag="name"/>
<MenuFlyoutItem Text="By OpenForms" Click="FilterItem_Click" Tag="lname"/>
<MenuFlyoutItem Text="By Ideas" Click="FilterItem_Click" Tag="ideas"/>
</MenuFlyout>
</AppBarButton.Flyout>
</AppBarButton>
</CommandBar>
</Page.BottomAppBar>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemsSource="{x:Bind Path=person}" Margin="105,130,95,70">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Person">
<TextBlock Text="{x:Bind Name}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>
我的cs代码:
using App2.WrittenLibraries;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace App2
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
///
public class Person : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
private string lastname;
private string v1;
private string v2;
public string Lastname
{
get { return lastname; }
set
{
lastname = value;
OnPropertyChanged("Lastname");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (propertyName != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public Person(string v1, string v2)
{
this.v1 = v1;
this.v2 = v2;
}
}
public sealed partial class MainPage : Page
{
public ObservableCollection<Person> person = new ObservableCollection<Person>();
public MainPage()
{
this.InitializeComponent();
person.Add(new Person("F1", "L1"));
person.Add(new Person("F2", "L2"));
}
private void FilterItem_Click(object sender, RoutedEventArgs e)
{
MenuFlyoutItem selectedItem = sender as MenuFlyoutItem;
if (selectedItem != null)
{
if (selectedItem.Tag.ToString() == "name")
{
Util.debugLog("FILTER BY NAME");
person = new ObservableCollection<Person>(person.OrderBy(i => i.Name));
//FilterByUpvotes()();
}
else if (selectedItem.Tag.ToString() == "lname")
{
Util.debugLog("FILTER BY L_NAME");
person = new ObservableCollection<Person>(person.OrderBy(i => i.Lastname));
//FilterByOpenForm();
}
else if (selectedItem.Tag.ToString() == "ideas")
{
Util.debugLog("FILTER BY IDEAS");
//person = new ObservableCollection<Person>(person.OrderBy(i => i));
//FilterByIdeas();
}
}
}
}
}
答案 0 :(得分:0)
解决这个问题的第一件事是找到代码的哪一部分生成这个空值,然后尝试理解c#中的以下代码,这对我来说非常有用,通过检查检索代码来避免空值。将读取我或不是..就像:
if(cmd.ExecuteScalar() == null)
MessageBox.Show("data is null");
else
//put ur code here
另外,不要忘记使用try catch block。
答案 1 :(得分:0)
您的问题在于使用x:bind绑定name属性。您的名称将始终为null,因为您没有设置任何值。所以绑定失败。 你能做的是 编辑列表视图模板,如
<ListView ItemsSource="{x:Bind Path=person}" Margin="105,130,95,70" Loaded="ListView_Loaded">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Person">
<TextBlock Text="{Binding Name}" Foreground="Red"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
并在创建人员时在代码内设置名称
public Person(string v1, string v2)
{
this.v1 = v1;
this.v2 = v2;
this.name = v1;//set name as v1
}
答案 2 :(得分:0)
您必须弄清楚从何处获取空值并将代码放在 try catch 块中,并为“System.ArgumentNullException”编写 catch 块。
try
{
`enter code here` // your code enter code here
}
catch (ArgumentNullException ex)
{
`enter code here` //code specifically for a ArgumentNullException
}