Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的MVVM方法有什么问题_C#_.net_Wpf_Silverlight_Mvvm - Fatal编程技术网

C# 我的MVVM方法有什么问题

C# 我的MVVM方法有什么问题,c#,.net,wpf,silverlight,mvvm,C#,.net,Wpf,Silverlight,Mvvm,我正在尝试使用silverlight-c#实现MVVM方法(不使用galla、prism或任何内置的东西) 我要做的是: (我在第一个视图中有一个按钮,该按钮下方有一个网格,不久将用于显示列表)。当我按下一个按钮时,它会弹出一个窗体,我在上面 将输入信息,该信息应显示在“程序图像1中文本”下方区域的列表中 我所做的是: 我已经成功地创建了按钮点击事件,并读取了用户从表单中写入的数据。现在的问题是,我无法在**程序下方的区域呈现用户从该表单读取的数据 在这里,您可以看到我在下面有区域程序,其中包括

我正在尝试使用silverlight-c#实现MVVM方法(不使用galla、prism或任何内置的东西)

我要做的是: (我在第一个视图中有一个按钮,该按钮下方有一个网格,不久将用于显示列表)。当我按下一个按钮时,它会弹出一个窗体,我在上面 将输入信息,该信息应显示在“程序图像1中文本”下方区域的列表中

我所做的是:

我已经成功地创建了按钮点击事件,并读取了用户从表单中写入的数据。现在的问题是,我无法在**程序下方的区域呈现用户从该表单读取的数据

在这里,您可以看到我在下面有区域程序,其中包括:姓名、作者和创建日期以及许多其他内容。就在下面,我想在点击按钮(“添加程序”按钮)获得的表单上显示我将从用户处读取的数据

(“添加程序”是要单击的按钮) 点击我得到:

ProgramGrid.xaml中用于绑定

<UserControl 
    x:Class="DEV_CENTER.ProgramGrid"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    xmlns:dataprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
    xmlns:local="clr-namespace:DEV_CENTER"
    xmlns:vm="clr-namespace:ViewModel;assembly=ViewModel"

    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" >

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Margin="5 5 5 20" Background="White">
            <TextBox Text="">
                <TextBox.Background>
                    <ImageBrush ImageSource="Images/search_icon.png" Stretch="None" AlignmentX="Right" />
                </TextBox.Background>
            </TextBox>
        </Grid>
        <Button Click="OnClick" Grid.Row="1" Height="25" >Add Programs</Button>
        <TextBlock Text="Programs" Grid.Row="2" FontWeight="Bold"/>
        <data:DataGrid  Grid.Row="3" x:Name="gridPrograms" SelectedItem="{Binding SelectedProgram, Mode=TwoWay}"  
                        AutoGenerateColumns="False" ItemsSource="{Binding Programs}" IsReadOnly="True">
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Header="Name"  Binding="{Binding Path=Name}" Width="3*"></data:DataGridTextColumn>
                <data:DataGridTextColumn Header="Author" Binding="{Binding Path=Author}" Width="2*" ></data:DataGridTextColumn>
                <data:DataGridTextColumn Header="Date Creation" Binding="{Binding Path=DateCreation}" Width="3*"></data:DataGridTextColumn>       
            </data:DataGrid.Columns>
        </data:DataGrid>
    </Grid>
</UserControl>
AddButton.xaml和AddButton.cs的按钮代码没有问题(我的意思是,在调试时,我在表单上输入的所有数据都可以在相应的字段(姓名、作者等)上看到)

AddButton.cs:

namespace DEV_CENTER
{
    public partial class AddButton : ChildWindow
    {
        public AddButton()
        {
            this.DataContext = AddButtonViewModel.getInstance();
            InitializeComponent();
        }        
    }
}
AddButtonViewModel.cs是我的视图模型类我想它有问题。

namespace ViewModel
{
    public class AddButtonViewModel : GenericViewModel
    {
      private static AddButtonViewModel addbuttonviewModel;
      public static AddButtonViewModel getInstance()
       {
        if (addbuttonviewModel == null) addbuttonviewModel = new AddButtonViewModel();
        return addbuttonviewModel;
       }

        #region PROPERTIES
        private ObservableCollection<AddButtonViewModel> programs;   //Its obtained for binding from ProgramGrid.xaml
        public ObservableCollection<AddButtonViewModel> Programs
        {
            get { return this.programs; }
            set { this.programs = value; OnPropertyChanged("Programs"); }
        }

        private String name;
        public String Name
        {
            get { return name; }
            set { name = value; OnPropertyChanged("Name"); }
        }
        private String version;
        public String Version
        {
            get { return version; }
            set { version = value; OnPropertyChanged("Version"); }
        }
        private String author;
        public String Author
        {
            get { return author; }
            set { author = value; OnPropertyChanged("Author"); }
        }
        private String company;
        public String Company
        {
            get { return company; }
            set { company = value; OnPropertyChanged("Company"); }
        }
        private String dateCreation;
        public String DateCreation
        {
            get { return dateCreation; }
            set { dateCreation = value; OnPropertyChanged("DateCreation"); }
        }
        private String description;

        public String Description
        {
            get { return description; }
            set { description = value; OnPropertyChanged("Description"); }
        }

        private ICommand saveCmd; ITS for Save Button click after writing the data on form popuped.
        public ICommand SaveCmd
        {
            get { return saveCmd; }
            set { saveCmd = value; }
        }


        private ICommand cancelCmd;
        public ICommand CancelCmd
        {
            get { return cancelCmd; }
            set { cancelCmd = value; }
        }
        #endregion

         #region CONSTRUCTOR
        public AddButtonViewModel()
        {
                this.saveCmd = new DelegateCommand(SaveMetadata);
                this.cancelCmd = new DelegateCommand(CancelMetadata);         

        }
        #endregion


        #region method

        /*
         * save from Form
         */
        public void SaveMetadata(object param)  //i can see on debugging that i have all the fields thati have saved in form
        {            
            programs = new ObservableCollection<AddButtonViewModel>();
            AddButtonViewModel p1 = new AddButtonViewModel();
            p1.Name = Name;
            p1.Author = Author;
            p1.Company = Company;
            p1.Description = Description;
            p1.DateCreation = DateCreation;
            Programs.Add(p1);
        }

        /*
         * cancel modification action
         */
        public void CancelMetadata(object param)
        {
            initForm();
        }
        #endregion
    }
}
名称空间视图模型
{
公共类AddButtonViewModel:GenericViewModel
{
私有静态AddButtonViewModel AddButtonViewModel;
公共静态AddButtonViewModel getInstance()
{
如果(addbuttonviewModel==null)addbuttonviewModel=new addbuttonviewModel();
返回addbuttonviewModel;
}
#区域属性
私有ObservableCollection程序;//从ProgramGrid.xaml绑定时获取
公共可观测收集计划
{
获取{返回this.programs;}
设置{this.programs=value;OnPropertyChanged(“programs”);}
}
私有字符串名称;
公共字符串名
{
获取{返回名称;}
设置{name=value;OnPropertyChanged(“name”);}
}
私有字符串版本;
公共字符串版本
{
获取{返回版本;}
设置{version=value;OnPropertyChanged(“version”);}
}
私有字符串作者;
公共字符串作者
{
获取{返回作者;}
设置{author=value;OnPropertyChanged(“author”);}
}
私人弦公司;
公共字符串公司
{
获取{返回公司;}
设置{company=value;OnPropertyChanged(“company”);}
}
私有字符串创建;
创建公共字符串日期
{
获取{return dateCreation;}
set{dateCreation=value;OnPropertyChanged(“dateCreation”);}
}
私有字符串描述;
公共字符串描述
{
获取{返回说明;}
设置{description=value;OnPropertyChanged(“description”);}
}
private ICommand saveCmd;在弹出的表单中写入数据后,单击其保存按钮。
公共ICommand SaveCmd
{
获取{return saveCmd;}
设置{saveCmd=value;}
}
私有ICommand cancelCmd;
公共ICommand CancelCmd
{
获取{return cancelCmd;}
设置{cancelCmd=value;}
}
#端区
#区域构造函数
公共AddButtonViewModel()
{
this.saveCmd=newdelegateCommand(SaveMetadata);
this.cancelCmd=新的DelegateCommand(CancelMetadata);
}
#端区
#区域法
/*
*从表格中保存
*/
public void SaveMetadata(object param)//在调试时,我可以看到我已将所有字段保存在表单中
{            
程序=新的ObservableCollection();
AddButtonViewModel p1=新的AddButtonViewModel();
p1.名称=名称;
p1.作者=作者;
p1.公司=公司;
p1.描述=描述;
p1.DateCreation=日期创建;
程序。添加(p1);
}
/*
*取消修改操作
*/
公共void取消元数据(对象参数)
{
initForm();
}
#端区
}
}

如何处理我的AddButtonViewModel.cs类,以便我能够以完全相同的方式呈现程序下方的列表(包含从表单保存的数据)?

在代码中,您将程序添加到基础数据结构(
程序
)而不是属性。您应该将其添加到
程序中
,以便setter提高
OnPropertyChanged
。此外,您还需要将
程序
属性更改为绑定到模型的值(
按钮程序

public void SaveMetadata(object param)//在调试时,我可以看到我已将所有字段保存在表单中
{ 
ObservableCollection newCollection=new
ObservableCollection(programs.ToList());
按钮程序p1=新按钮程序();
p1.名称=名称;
p1.作者=作者;
p1.公司=公司;
p1.描述=描述;
p1.DateCreation=日期创建;
newCollection.Add(p1);
程序=新集合;
}

此更改应该告诉您的UI更新列表。

我这样做了,但仍然没有更新任何内容。你注意到一件事了吗?我的ProgramGrid.xaml.cs类包含xaml CONATSIN按钮和数据显示所在的网格。它不包含DataConte
namespace ViewModel
{
    public class AddButtonViewModel : GenericViewModel
    {
      private static AddButtonViewModel addbuttonviewModel;
      public static AddButtonViewModel getInstance()
       {
        if (addbuttonviewModel == null) addbuttonviewModel = new AddButtonViewModel();
        return addbuttonviewModel;
       }

        #region PROPERTIES
        private ObservableCollection<AddButtonViewModel> programs;   //Its obtained for binding from ProgramGrid.xaml
        public ObservableCollection<AddButtonViewModel> Programs
        {
            get { return this.programs; }
            set { this.programs = value; OnPropertyChanged("Programs"); }
        }

        private String name;
        public String Name
        {
            get { return name; }
            set { name = value; OnPropertyChanged("Name"); }
        }
        private String version;
        public String Version
        {
            get { return version; }
            set { version = value; OnPropertyChanged("Version"); }
        }
        private String author;
        public String Author
        {
            get { return author; }
            set { author = value; OnPropertyChanged("Author"); }
        }
        private String company;
        public String Company
        {
            get { return company; }
            set { company = value; OnPropertyChanged("Company"); }
        }
        private String dateCreation;
        public String DateCreation
        {
            get { return dateCreation; }
            set { dateCreation = value; OnPropertyChanged("DateCreation"); }
        }
        private String description;

        public String Description
        {
            get { return description; }
            set { description = value; OnPropertyChanged("Description"); }
        }

        private ICommand saveCmd; ITS for Save Button click after writing the data on form popuped.
        public ICommand SaveCmd
        {
            get { return saveCmd; }
            set { saveCmd = value; }
        }


        private ICommand cancelCmd;
        public ICommand CancelCmd
        {
            get { return cancelCmd; }
            set { cancelCmd = value; }
        }
        #endregion

         #region CONSTRUCTOR
        public AddButtonViewModel()
        {
                this.saveCmd = new DelegateCommand(SaveMetadata);
                this.cancelCmd = new DelegateCommand(CancelMetadata);         

        }
        #endregion


        #region method

        /*
         * save from Form
         */
        public void SaveMetadata(object param)  //i can see on debugging that i have all the fields thati have saved in form
        {            
            programs = new ObservableCollection<AddButtonViewModel>();
            AddButtonViewModel p1 = new AddButtonViewModel();
            p1.Name = Name;
            p1.Author = Author;
            p1.Company = Company;
            p1.Description = Description;
            p1.DateCreation = DateCreation;
            Programs.Add(p1);
        }

        /*
         * cancel modification action
         */
        public void CancelMetadata(object param)
        {
            initForm();
        }
        #endregion
    }
}
public void SaveMetadata(object param) //i can see on debugging that i have all the fields thati have saved in form 
{ 
    ObservableCollection<ButtonProgram> newCollection = new 

    ObservableCollection<ButtonProgram>(programs.ToList()); 
    ButtonProgram p1 = new ButtonProgram(); 
    p1.Name = Name; 
    p1.Author = Author; 
    p1.Company = Company; 
    p1.Description = Description; 
    p1.DateCreation = DateCreation; 
    newCollection.Add(p1); 
    Programs = newCollection;
}