0

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

这是我所做的。

保存数据的类。个人.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
}

像这样在 App.xaml.cs 中声明了 Person。

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>

谢谢。

4

2 回答 2

3

您应该使用集合控件,例如 anItemsControl并将其绑定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以便通知 UI。

如果您想坚持使用静态属性,请查看此处

于 2013-04-09T17:45:27.310 回答
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 。

于 2013-04-09T18:07:46.990 回答