为什么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逻辑有什么错误吗?还是其他什么?为什么会崩溃?

为什么visualstudio在更改“;ItemsSource=“;{绑定路径=Sss1}”;当我试图改变“;sss1”

您有一个堆栈溢出:

    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");
        }        
    }