我创建了一个Day
类:
public class Day
{
public int DayOfMonth
{
get { return dayOfMonth; }
}
public List<Entry> CalendarDayItems
{
get { return calendarDayItems; }
set { calendarDayItems = value; }
}
private DateTime date;
private int dayOfMonth;
private List<Entry> calendarDayItems;
public Day(DateTime date, List<Entry> entries)
{
this.date = date;
this.dayOfMonth = date.Day;
this.calendarDayItems = entries;
}
}
接下来,我创建了一个WPF UserControl
,我希望将这些天数集合到ItemsControl
。我创建了一个绑定到ObservableCollection<Day> Days
的依赖项属性ItemsControl
。这是XAML:
<UserControl ... Name="CalendarMonthViewControl">
...
<ItemsControl
ItemsSource="{Binding ElementName=CalendarMonthViewControl, Path=Days}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="6" Columns="7" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="Day">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!-- The following two bindings don't work -->
<TextBlock
Grid.Column="0"
Text="{Binding Path=DayOfMonth}" />
<ItemsControl
Grid.Column="1"
ItemsSource="{Binding Path=CalendarDayItems}">
</ItemsControl>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
...
我有几个问题:
ItemsControl
,即是否建议命名控件然后将其作为绑定源引用? TextBlock
和第二个ItemsControl
不会分别绑定到DayOfMonth
类的CalendarDayItems
和Day
属性。 答案 0 :(得分:1)
如果您在调试器中运行您的应用程序,任何带有绑定的错误都将显示在“输出”窗口中。这可以用来找出绑定无效的原因。
答案 1 :(得分:0)
对于解决Q2问题有一些很好的建议,但对于Q1,我建议你为UserControl设置DataContext,然后在ItemsControl中你可以使用ItemsSource="{Binding Path=Days}"
。
这使您可以轻松地将DataContext替换为另一个,例如,对您的控件进行简单测试。这也意味着如果{User>内容中的Days
或其他属性用于其他控件,则无需重复ElementName标记。
此机制通常与Model-View-ViewModel(MVVM)设计模式一起使用(请参阅MSDN),其中ViewModel是View的DataContext。
在您的示例中,您可以直接在XAML中设置DataContext,使用类似的方法:
<UserControl DataContext="{Binding Path=CalendarMonthViewControl}}" ... />
或者您可以在其中设置文件背后的代码。