如何在WPF模板C#中正确格式化我的数据

时间:2016-08-22 19:02:52

标签: c# wpf xaml


我正在使用WPF在C#中创建一个小项目,我在格式化xaml文件中的数据时遇到了一些问题。

我的程序从url下载一个包含多个序列化新闻对象的xml文件,这些对象具有标题,发布日期等属性。内容等 我必须根据特定的模板在窗口中显示所有这些新闻。

在我将所有数据解析为List新闻后,我无法弄清楚应该使用哪些控件以及如何正确使用绑定。

我想创建一个模板,我可以重复使用每个新闻对象,而不知道确切的对象数量 我搜索了一些信息,发现我需要DataTemplate控件,它应该是每个对象的图形表示,但是我不确定如何将这个模板与我的数据结合起来,一般来说,我应该在外面写什么<Window.Resources>标记(DataTemplate所在的位置)

一点帮助将不胜感激,
由于

PS:在我的项目的另一部分,我使用组合框做了类似的事情,但在这种情况下,我不想使用组合框,但使用更复杂的模板,文本块,标签等。 />

模板应该是这样的:

  

更新

      ChangeLog 18/08/2016
      

  • 更改编号1
  • 更改编号2
  • 更改编号N


      ChangeLog 17/08/2016

      
  • 更改编号1
  • 更改编号2
  • 更改编号N


      ChangeLog 16/08/2016

      
  • 更改编号1
  • 更改编号2
  • 更改编号N

1 个答案:

答案 0 :(得分:1)

我将简要介绍一下如何做这个MVVM风格。所以你必须首先意识到你的视图背后有一个ViewModel。要使绑定生效,您需要将ViewModel分配给DataContext。有很多方法可以做到这一点,但我会快速而又脏。您应该了解MVVM提供解决方案的方法。

通常,您需要3种类来生成模板。 View,ViewModel和Model。该模型将是您下载的数据。 ViewModel将保存您的数据集合。 (注意:如果您计划连续下载数据并将其添加到列表中,则需要将其设置为可观察列表)。您的ViewModel通常如下所示。

public class MainViewModel
{
    ObservableCollection<SimpleModel> _list = new ObservableCollection<SimpleModel>();
    public ObservableCollection<SimpleModel> List
    {
        get { return _list; }
    }

    public MainViewModel()
    {
        _list.Add(new SimpleModel() { Name = "obj1" });
        _list.Add(new SimpleModel() { Name = "obj2" });
        _list.Add(new SimpleModel() { Name = "obj3" });
    }


}

简单模型只是数据的占位符,但看起来像这样。

public class SimpleModel
{
    public String Name { get; set; }
}

现在,在您的视图中,您需要通过将ViewModel应用于DataContext,将View连接到后面代码中的viewmodel。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }
}

现在您已经使用了DataContext,您可以通过将列表应用到其中一个核心容器来显示您的列表。您还需要为您的数据类型声明一个datatemplate。 (请注意,您需要将数据类型添加到命名空间)。它看起来与此类似。

<Grid>
    <Grid.Resources>
        <DataTemplate DataType="{x:Type local:SimpleModel}">
            <Label Foreground="Red"
                   Content="{Binding Name}" />
        </DataTemplate>
    </Grid.Resources>
    <ListView ItemsSource="{Binding List}">

    </ListView>
</Grid>

您所要做的就是将datatemplate的内部更改为您想要显示的内容。这将允许您以MVVM方式显示它。这只是一个简短的整体介绍,你应该阅读更多关于这一点。