我正在尝试运行(在C#4.0,Visual Studio 2010中)来自
的代码在VS2010 WPF应用程序项目的MainWindow.xaml.cs中添加了 myOrders 的实例化,但是我正在进入XAML
由于未知数据上下文无法解析符号“ myOrders ”
在MainWindows.xaml上指向 myOrders 上的鼠标:
ItemsSource="{Binding myOrders}"
在这种情况下,启动WPF应用程序的完整XAML脚本是什么?
更新:
我删除了我的代码,因为提供答案和评论是多余的 请注意,我对最简单启动插图 - 数据绑定的实现感兴趣:
我在互联网上找不到。
教程,演练或示例中的代码,我可以发现,要么不编译,要么因为并发症模糊概念和理解而过度膨胀。
即。我更喜欢disappeared answer with simpler code,虽然我不能将其投票或标记为正确,因为它不是我的。
答案 0 :(得分:3)
首先,myOrders必须是公共财产。即使它是一个公共变量也看不到它,其次是让视图(XAML)知道你需要在窗口的构造函数中设置DataContext = this;
后面的代码中发生了什么
设置如下属性:public List<Order> myOrder {get;set;}
如果您需要从后面的代码更新视图,那么您需要实现INotifyPropertyChanged
接口。它负责执行更新视图作业。这是一个small tutorial from MSDN。
最后一件事,(根据我的经验)你应该使用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; }
}
}
答案 1 :(得分:0)
更简单的答案:
这很有趣但我没有看到in HichemC's answer编辑他的倒数第二版C#代码使用相同的XAML而没有任何膨胀:
这个更简单的代码对我有用:
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; }
}
}