从代码后面到xaml的类数组

时间:2013-04-09 17:41:15

标签: wpf arrays xaml code-behind

我想在app.xaml.cs中定义的类数组的xaml数据中显示。

继承人我做了什么。

保存数据的类。 Person.cs

public class Person : INotifyPropertyChanged
{
    #region Constructors and Destructors

    public Person(int id, string name)
    {
        this.Name = name;
        this.Id = id;
    }

    #endregion

    #region Public Events

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Public Properties

    public int Id { get; set; }

    public string Name { get; set; }

    #endregion

    #region Methods

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

Person在App.xaml.cs中声明如此。

public partial class App : Application
{
    public static Person[] People =
        {
            new Person(1, "John"),
            new Person(2, "Jake"),
            new Person(3, "James"),
            new Person(4, "Jack")
        };
}

我想在xaml中显示数据。我似乎无法弄清楚如何做到这一点。

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBox Height="23" TextWrapping="Wrap" Text="id"/>
        <TextBox Height="23" TextWrapping="Wrap" Text="name"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBox Height="23" TextWrapping="Wrap" Text="id"/>
        <TextBox Height="23" TextWrapping="Wrap" Text="name"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBox Height="23" TextWrapping="Wrap" Text="id"/>
        <TextBox Height="23" TextWrapping="Wrap" Text="name"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBox Height="23" TextWrapping="Wrap" Text="id"/>
        <TextBox Height="23" TextWrapping="Wrap" Text="name"/>
    </StackPanel>
</StackPanel>

感谢。

2 个答案:

答案 0 :(得分:3)

您应该使用集合控件,例如ItemsControl并将其ItemsSource绑定到您的静态属性:

<ItemsControl ItemsSource="{Binding ...}">
   <ItemTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <TextBox Height="23" TextWrapping="Wrap" Text="{Binding Id}" />
            <TextBox Height="23" TextWrapping="Wrap" Text="{Binding Name}" />
         </StackPanel>
      </DataTemplate>
   </ItemTemplate>
</ItemsControl>

您不应该使用静态属性,而是将一个服务注入到您的视图模型中(该视图充当此视图的数据上下文),并确保此服务是单例。

您还需要在PropertyChanged属性的设置者中调用Person事件,以便通知用户界面。

如果你想坚持使用静态属性,那么看看here

答案 1 :(得分:1)

通常使用ItemsControl或其中一个子类是可行的方法。如果您希望xaml与原始帖子中输入的完全相同,那么这就是实现它的方法:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:a="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
  <StackPanel DataContext="{x:Static a:App.People}">
    <StackPanel Orientation="Horizontal">
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [0].Id}"/>
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [0].Name}"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [1].Id}"/>
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [1].Name}"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [2].Id}"/>
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [2].Name}"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [3].Id}"/>
      <TextBox Height="23" TextWrapping="Wrap" Text="{Binding [3].Name}"/>
    </StackPanel>
  </StackPanel>
</Window>

有关xaml中属性路径的更多信息,请查看此处:http://msdn.microsoft.com/en-us/library/ms742451(v=vs.110).aspx