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