2014-04-17 75 views
0

我正在使用c#和xaml開發silverlight應用程序。我必須像顯示的信息:如何使用列表顯示列中某個人的信息?

SerialNumber FirstName LastName 
s0    ss1  ss1L 
s1    ss2  ss2L 

其中s0 ss1 ss1L和s 1 ss2 ss2L必須List

和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: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:vm="clr-namespace:ViewModel;assembly=ViewModel" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <UserControl.Resources> 
     <vm:ProgramViewModel x:Key="ProgramViewModel"/> 
    </UserControl.Resources> 
    <data:DataGrid Grid.Row="0" x:Name="gridPrograms" AutoGenerateColumns="False" ItemsSource="{Binding Path=Ssss1 }" IsReadOnly="True" DataContext="{StaticResource ProgramViewModel}" > 
     <data:DataGrid.Columns> 
      <data:DataGridTextColumn Header="SerialNumber" Binding="{Binding Path=sss1}" Width="2*"></data:DataGridTextColumn> 
     <data:DataGridTextColumn Header="FirstName" Binding="{Binding Path=sss2}" Width="2*"></data:DataGridTextColumn> 
      <data:DataGridTextColumn Header="LastName" Binding="{Binding Path=sss3}" Width="3*"></data:DataGridTextColumn>    
     </data:DataGrid.Columns> 
    </data:DataGrid> 
</UserControl> 

現在我應該如何對應於實現什麼我都問在視圖模型和模型的C#代碼?

Iam肯定有東西要這樣:請糾正我,如果我錯了?

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); 
      programs.Add(p3); 
      return programs; 
     } 

請幫我用mvvm實現我的目標。

+0

你能澄清你的問題?你想得到什麼具體結果? –

+0

@KenHung請在頂部看到:「SerialNumber FirstName LastName」(必須在xaml中)和「s0 ss1 ss1L」「s1 ss2 ss2L」必須使用c#使用Mvvm的概念完成。我的意思是我的Xaml代碼不能改變(它顯示標題),但是你可以寫C#代碼來達到目的。 – Sss

回答

2

UPDATE II:

響應您的評論:

  1. 的ObservableCollection具有構造which accept ListIEnumerable作爲參數。
  2. 測試了WPF中的代碼,在XAML部分中儘可能稍作修改,對我來說工作正常。兩行顯示在屏幕截圖下方。

enter image description here


假設你有ProgramsProgramViewModel屬性:

public ObservableCollection<Program> Programs { get; set; } 

這是在視圖模型的構造函數初始化:

Programs = new ObservableCollection<Program>(getAllPrograms()); 

你可以綁定DataGridItemsSourcePrograms屬性,每列綁定到相應的Program屬性:

<data:DataGrid Grid.Row="0" x:Name="gridPrograms" AutoGenerateColumns="False" 
       ItemsSource="{Binding Programs}" IsReadOnly="True" 
       DataContext="{StaticResource ProgramViewModel}" > 
    <data:DataGrid.Columns> 
     <data:DataGridTextColumn Header="SerialNumber" Binding="{Binding SerialNumber}" Width="2*"></data:DataGridTextColumn> 
     <data:DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" Width="2*"></data:DataGridTextColumn> 
     <data:DataGridTextColumn Header="LastName" Binding="{Binding LastName}" Width="3*"></data:DataGridTextColumn>    
    </data:DataGrid.Columns> 
</data:DataGrid> 

請注意,只有結合的公共屬性,而不是場/成員的作品,所以要確保的SerialNumber,名字,和姓氏是公共屬性。

下一步,看看INotifyPropertyChanged接口。

UPDATE:

//viewmodel 
public class ProgramViewModel 
{ 
    public ObservableCollection<Program> Programs { get; set; } 

    public ProgramViewModel() 
    { 
     Programs = new ObservableCollection<Program>(getAllPrograms()); 
    } 

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

//model 
public class Program 
{ 
    public string SerialNumber { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

//view 
<Page.Resources> 
    <vm:ProgramViewModel x:Key="ProgramViewModel"/> 
</Page.Resources> 
<Grid> 
    <data:DataGrid Grid.Row="0" x:Name="gridPrograms" AutoGenerateColumns="False" 
       ItemsSource="{Binding Programs}" IsReadOnly="True" 
       DataContext="{StaticResource ProgramViewModel}" > 
     <data:DataGrid.Columns> 
      <data:DataGridTextColumn Header="SerialNumber" Binding="{Binding SerialNumber}" Width="2*"></data:DataGridTextColumn> 
      <data:DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" Width="2*"></data:DataGridTextColumn> 
      <data:DataGridTextColumn Header="LastName" Binding="{Binding LastName}" Width="3*"></data:DataGridTextColumn>    
     </data:DataGrid.Columns> 
    </data:DataGrid> 
</Grid> 
+0

那麼我想要什麼不能實現?還有其他的選擇嗎? ViewModel代碼的外觀如何? – Sss

+0

我以爲這是你想要的?沒有?上面已經顯示了ViewModel的相關部分。它應該包含'程序'屬性。 – har07

+0

我很抱歉,但我是一個初學者,但我仍然無法完成你可以寫一個有3個文件「ManPage.xaml」「Model.cs」和「ViewModel.cs」的小樣本,它們完成了相同的工作。這將是一個很大的幫助。感謝洛塔特。 – Sss

相關問題