我正在尝试将排列在堆栈面板中的 2D 按钮数组绑定(bind)到 2D ObservableCollection ...
然而,恐怕我不了解绑定(bind)的一些非常基本的东西。
我的 XAML:
<Window.Resources>
<DataTemplate x:Key="ItemsAsButtons">
<Button Content="{Binding}" Height="100" Width="100"/>
</DataTemplate>
<DataTemplate x:Key="PanelOfPanels">
<ItemsControl ItemsSource="{Binding Path=DayNumbers}" ItemTemplate=" {DynamicResource ItemsAsButtons}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</Window.Resources>
...
<ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
ItemTemplate="{DynamicResource PanelOfPanels}"/>
我的 C# 代码:
后端:
/// <summary>
/// Window BE for Calendar.xaml
/// </summary>
public partial class Calendar : Window
{
private CalendarViewModel _vm;
public Calendar()
{
InitializeComponent();
_vm = new CalendarViewModel();
this.DataContext = _vm;
}
}
View 模型:
class CalendarViewModel
{
CalendarMonth _displayedMonth;
EventCalendar _calendar;
public CalendarViewModel()
{
_displayedMonth = new CalendarMonth();
}
public ObservableCollection<ObservableCollection<int>> DayNumbers
{
get
{
return _displayedMonth.DayNumbers;
}
}
}
我正在尝试使用 CalendarViewModel.DayNumbers 中的值填充按钮 - 但按钮没有出现。我的绑定(bind)显然做错了什么。
最佳答案
改变你所有的DynamicResource
至StaticResource
.这不应该停止它的工作,但在运行时可能效率低下。看看this page WPF 资源概述。
还有你的ItemsControl
未绑定(bind)到 DayNumbers
.像这样添加绑定(bind):
<ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
ItemTemplate="{StaticResource PanelOfPanels}"
ItemsSource={Binding DayNumbers}/>
当您设置
DataContext
在日历窗口上,您设置哪个对象将成为整个窗口的默认绑定(bind)源。您没有指定 ViewModel 的哪个属性绑定(bind)到 ItemsControl
.这就是上面的代码所做的。编辑 因为您要覆盖
ItemsControl
的项目模板并在那里提供收集容器,您需要提供ItemsSource
也为它。语法 {Binding}
简单的意思是绑定(bind)到每个成员或枚举 , 在这种情况下 ObservableCollection<int>
.重申一下,模板就是这样 - 用于显示数据的模板。它应该是可重用的,你应该能够将它绑定(bind)到你想要的任何模型。经验法则 - 与实际数据的数据绑定(bind)应该发生在控件上,而不是模板上。
关于c# - 关于 WPF 绑定(bind)的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879080/