0

我正在尝试运行(在 C# 4.0、Visual Studio 2010 中)来自

在 VS2010 WPF 应用程序项目的 MainWindow.xaml.cs 中添加了myOrders的实例化,但正在进入 XAML

由于未知的数据上下文,无法解析符号“ myOrders ”

在 MainWindows.xaml 中指向myOrders上的鼠标时:

 ItemsSource="{Binding myOrders}"

在这种情况下,启动 WPF 应用程序的完整 XAML 脚本是什么?

更新:

我删除了我的代码,因为提供的答案和评论是多余的。
请注意,我对以下数据绑定的最简单的启动插图实现感兴趣:

  • 复合(分层或多维/锯齿状数组或列表) List<> 对象(在 C# 中实例化,但未在 XAML 中实例化)
  • 模仿主从关系,TreeView

我在互联网上找不到准备好的。

我可以发现,教程、演练或示例中的代码要么不编译,要么因混淆概念和理解的复杂性而过于臃肿。

即我更喜欢用更简单的代码消失的答案,尽管我不能投票或将其标记为正确,因为它不是我的。

4

2 回答 2

3

首先 myOrders 必须是公共财产。即使它是一个公共变量也看不到它,其次是让视图(XAML)知道你需要DataContext = this;在窗口的构造函数中设置的代码中发生了什么

设置这样的属性:public List<Order> myOrder {get;set;}

如果您需要从后面的代码更新视图,那么您需要实现INotifyPropertyChanged接口。它负责更新视图工作。这是来自 MSDN 的一个小教程

最后一件事,(根据我的经验)你应该使用 type 属性ObservableCollection<Order>而不是List<Order>.

XAML:

<Grid>
  <ItemsControl  x:Name="visual"
                 ItemsSource="{Binding MyOrders}"
                 HorizontalAlignment="Stretch"
                 HorizontalContentAlignment="Stretch">
    <ItemsControl.ItemTemplate>
      <!-- This defines the DataTemplate to display one Order object-->
      <DataTemplate>
        <StackPanel>
          <TextBlock Text="{Binding OrderName}"
                     Margin="10" />

          <ItemsControl ItemsSource="{Binding PartsList}"
                        HorizontalAlignment="Stretch"
                        HorizontalContentAlignment="Stretch">
            <ItemsControl.ItemTemplate>
              <!-- This defines the DataTemplate to display one Parts object-->
              <DataTemplate>
                <Grid HorizontalAlignment="Stretch">
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                  </Grid.ColumnDefinitions>
                  <TextBlock Grid.Column="0"
                             Text="{Binding PartName}"
                             TextAlignment="Center" />
                  <TextBlock Grid.Column="1"
                             Text="{Binding PartQuantity}"
                             TextAlignment="Center" />
                </Grid>
              </DataTemplate>
            </ItemsControl.ItemTemplate>
          </ItemsControl>
        </StackPanel>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Grid>

后面的代码:

  /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
{
    public ObservableCollection<Order> MyOrders
    {
        get { return _myOrders; }
        set { _myOrders = value; OnPropertyChanged("MyOrders"); }
    }

    Order order1 = new Order
     {
         OrderName = "Order1",
         PartsList = new List<Parts>()
        {
            new Parts {PartName = "Part11", PartQuantity = 11},
            new Parts {PartName = "Part12", PartQuantity = 12}
        }
     };

    private ObservableCollection<Order> _myOrders;

    public MainWindow()
    {
        InitializeComponent();
        MyOrders = new ObservableCollection<Order>();
        MyOrders.Add(order1);
        DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
    public class Order
    {
        public string OrderName { get; set; }
        public List<Parts> PartsList { get; set; }
    }

    public class Parts
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        }
}
于 2013-01-23T06:57:48.233 回答
0

更简单的答案:这很有趣,但我在 HichemC 的答案中
没有看到编辑他的倒数第二版 C# 代码,使用相同的 XAML,没有任何膨胀:

  • 可观察集合
  • OnPropertyChanged()
  • INotifyPropertyChanged
  • PropertyChangedEventHandler

这个更简单的代码对我有用:

public partial class MainWindow : Window
{
    public List<Order> myOrders { get; set; }
    Order order1 = new Order
    {
        OrderName = "Order1",
        PartsList = new List<Parts>()
        {
              new Parts {PartName = "Part11", PartQuantity = 11},
              new Parts {PartName = "Part12", PartQuantity = 12}
         }
     };
    Order order2 = new Order
    {
        OrderName = "Order2",
        PartsList = new List<Parts>()
        {
              new Parts {PartName = "Part21", PartQuantity = 21},
              new Parts {PartName = "Part22", PartQuantity = 22},
              new Parts {PartName = "Part23", PartQuantity = 23}
         }
     };

     public MainWindow()
        {
            InitializeComponent();
            myOrders = new List<Order>();
            myOrders.Add(order1);
            myOrders.Add(order2);
            DataContext = this;
        }
    }
    public class Order
    {
        public string OrderName { get; set; }
        public List<Parts> PartsList { get; set; }
    }

    public class Parts
    {
        public string PartName { get; set; }
        public double PartQuantity { get; set; }
        }
}

WPF 应用程序中的主从复合列表对象数据绑定 - 最简单的可能实现

于 2013-01-23T10:38:21.830 回答