繁体   English   中英

我的MVVM方法有什么问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM