【问题标题】:How to display information of a person in a column using a List?如何使用列表在列中显示一个人的信息?
【发布时间】:2014-06-01 19:24:44
【问题描述】:

我正在使用 c# 和 xaml 开发一个 Silverlight 应用程序。我必须显示如下信息:

SerialNumber  FirstName LastName
s0             ss1       ss1L
s1             ss2       ss2L 

其中s0 ss1 ss1L 和 s1 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# 中编码以实现我在 ViewModel 和 Model 中提出的要求?

我确定一定是这样的:如果我错了,请纠正我?

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 实现我的目标。

【问题讨论】:

  • 你能澄清你的问题吗?你想得到什么具体的结果?
  • @KenHung 请在顶部查看:“SerialNumber FirstName LastName”(必须在 xaml 中)和“s0 ss1 ss1L”“s1 ss2 ss2L”必须使用 c# 使用 Mvvm 的概念来完成。我的意思是我的标题不能更改(显示标题)的 Xaml 代码,但您可以根据需要编写 C# 代码。

标签: c# xaml data-binding mvvm binding


【解决方案1】:

更新二:

回复您的评论:

  1. ObservableCollection 有构造函数which accept ListIEnumerable 作为参数。
  2. 在 WPF 中测试了代码,在 XAML 部分中进行了最轻微的修改,对我来说工作正常。如下图所示的两行。


假设您在ProgramViewModel 中有一个属性Programs

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

在viewmodel的构造函数中初始化:

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

您可以将DataGridItemsSource绑定到Programs属性,并将每一列绑定到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、FirstName 和 LastName 是公共属性。

下一步,查看INotifyPropertyChanged 接口。

更新:

//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>

【讨论】:

  • 所以我想要的不能实现?还有其他选择吗? ViewModel 代码会是什么样子?
  • 我以为这就是你想要的?不?上面已经显示了 ViewModel 的相关部分。它应该包含Programs 属性。
  • 我很抱歉,但我是初学者,我仍然无法完成,请你写一个包含 3 个文件“ManPage.xaml”“Model.cs”和“ViewModel.cs”的小样本完成同样的事情。这将是一个很大的帮助。非常感谢。
  • 用更接近完整的代码更新了答案。不过我还没有真正测试过代码
  • 它不起作用。我观察到的第一件事可能是错误的 getAllPrograms() 在定义中具有返回类型“List”,而在调用中键入“ObservableCollection”。它只显示标题,但标题下方的列中没有任何内容。你能改进一下吗?谢谢..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多