为什么visualstudio在更改“;ItemsSource=“;{绑定路径=Sss1}”;当我试图改变“;sss1”
本文关键字:sss1 Sss1 改变 绑定 visualstudio ItemsSource 为什么 路径 | 更新日期: 2023-09-27 17:58:54
我正在尝试开发一个silverlight应用程序,当我尝试将"sss1"更改为"Programs"时,当我更改"ItemsSource="{Binding Path=sss1}时,该应用程序会崩溃(我的意思是当我尝试执行时
ItemsSource="{绑定Path=Programs}"
然后它使Visual Studio崩溃。
在解释中(我想做的是):
我是使用c和xaml的silverlight应用程序的初学者。我想做的是显示信息,比如:
SerialNumber FirstName LastName //These are headingand below is the data
s0 ss1 ss1L
s1 ss2 ss2L
其中CCD_ 1和CCD_ 2L必须是List。
我的问题是:
它只是显示标题,而不是下面的数据,如下所示:http://prntscr.com/3axadr但在标题下方不要显示任何内容。
我的代码如下:
我的项目名称是DEV_CENTER和主页。Xaml是
<UserControl x:Class="DEV_CENTER.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:DEV_CENTER"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<vm:ProgramViewModel x:Key="ProgramViewModel"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<data:DataGrid Grid.Row="0" x:Name="gridPrograms" AutoGenerateColumns="False" ItemsSource="{Binding Path=Programs }" IsReadOnly="True" DataContext="{StaticResource ProgramViewModel}" >
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="SerialNumber" Binding="{Binding Path=SerialNumber}" Width="2*"></data:DataGridTextColumn>
<data:DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" Width="2*"></data:DataGridTextColumn>
<data:DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}" Width="3*"></data:DataGridTextColumn>
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
我的ProgramViewModel.cs(ViewModel)文件是:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace DEV_CENTER
{
public class ProgramViewModel : INotifyPropertyChanged
{
#region PROPERTIES
public ObservableCollection<Program> Programs
{
get
{
return Programs;
}
set
{
OnPropertyChanged("Programs");
}
}
#endregion
#region Constructor
public ProgramViewModel()
{
Programs = new ObservableCollection<Program>(getAllPrograms());
MessageBox.Show("check1");
}
#endregion
public List<Program> getAllPrograms()
{
List<Program> programs = new List<Program>();
Program p1 = new Program();
p1.SerialNumber = "ss0";
p1.FirstName = "ss1";
p1.LastName = "ss1L";
Program p2 = new Program();
p2.SerialNumber = "Program 2";
p2.FirstName = "ss1";
p2.LastName = "ss2L";
programs.Add(p1);
programs.Add(p2);
return programs;
}
#region EVENTS
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}
Program.cs(模型)是:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace DEV_CENTER
{
public class Program
{
#region PROPERTIES
public string SerialNumber
{
get;
set;
}
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
#endregion
public Program()
{
SerialNumber = "";
FirstName = "";
LastName = "";
}
}
}
这几乎是我的全部项目。您可以使用所有代码进行测试。Mvvm逻辑有什么错误吗?还是其他什么?为什么会崩溃?
您有一个堆栈溢出:
public ObservableCollection<Program> Programs
{
get
{
return Programs; // upper case p! recursively calling itself!
}
...
}
该属性将永远递归地调用自己。
你需要添加一个字段,比如
private ObservableCollection<Program> programs; // note lower case p!
public ObservableCollection<Program> Programs // upper case p!
{
get
{
return this.programs; // lower case p!
}
...
}
此外,你的二传手从不做任何事情,所以这不好:
set
{
OnPropertyChanged("Programs");
}
这只是启动一个属性更改,它从来没有设置值!
完整的属性应该是:
private ObservableCollection<Program> programs; // note lower case p!
public ObservableCollection<Program> Programs // upper case p!
{
get
{
return this.programs; // lower case p!
}
set
{
this.programs = value; // lower case p
OnPropertyChanged("Programs");
}
}