[英]Whats wrong with my MVVM approach here
我正在嘗試使用silverlight-c#實現MVVM方法(不使用加拉或棱鏡或任何內置的東西)。
我必須做的:(我在第一個視圖中有一個按鈕,該按鈕正下方有一個網格,該網格將很快用於顯示列表)。 當我按下一個按鈕時,它將彈出一個表單,在該表單上我將輸入信息,並且該信息應該顯示在“圖像1中的程序文本”下方區域的列表中。
我所做的是:
我在按鈕單擊上成功創建了事件,並讀取了用戶從表單寫入的數據。 現在的問題是, 我無法呈現用戶在** Programs之外的區域從該表格讀取的數據 。
在這里,您可以看到我在程序 下面有區域,包括:名稱,作者和日期創建以及許多其他內容。 在其正下方,我想在單擊按鈕(“添加程序”按鈕)獲得的表單上顯示要從用戶讀取的數據。
(“添加程序”是要單擊的按鈕)單擊后得到:
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>
以及ProgramGrid.xaml.cs的代碼:
namespace DEV_CENTER
{
public partial class ProgramGrid : UserControl
{
public ProgramGrid()
{
InitializeComponent();
this.DataContext = AddButtonViewModel.getInstance();
}
private void OnClick(object sender, System.Windows.RoutedEventArgs e)
{
AddButton addProgramObj = new AddButton(); //Because AddButton is my xaml childwindow
addProgramObj.Show();
}
}
}
並且AddButton.xaml和AddButton.cs的按鈕代碼沒有問題(我的意思是,在單擊按鈕時獲得的表單上輸入的所有數據在調試時都可以在相應的字段(名稱,作者等)上看到)。
AddButton.cs:
namespace DEV_CENTER
{
public partial class AddButton : ChildWindow
{
public AddButton()
{
this.DataContext = AddButtonViewModel.getInstance();
InitializeComponent();
}
}
}
而AddButtonViewModel.cs是我的View模型類。 我想這有問題。
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.cs類,以便能夠以完全相同的方式在程序下面呈現List(包含從Form保存的數據)?
在您的代碼中,將程序添加到基礎數據結構( programs
)而不是屬性。 您應該將其添加到“ Programs
中,以使設置Programs
可以提高OnPropertyChanged
。 同樣,您將需要更改Programs
屬性以綁定到模型的值( ButtonProgram
)。
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;
}
此更改應告訴您的UI更新列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.