如何将依赖项属性绑定到WPF中的控件?
我创建了一个Day
类:如何将依赖项属性绑定到WPF中的控件?
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>
...
我有几个问题:
- 我使用的正确方法到dependecy属性绑定到
ItemsControl
,即是它推荐给命名控件,然后引用它是一个有约束力的来源? - 主要问题是
TextBlock
和第二个ItemsControl
将分别不与DayOfMonth
和CalendarDayItems
类别的属性绑定。
如果您在调试器中运行您的应用程序,则任何带绑定的错误都将显示在“输出”窗口中。这可以用来找出为什么绑定不起作用。
在输出窗口中,我发现'DayOfMonth'和'MonthEntries'是不存在的属性。一旦我检查了“Day”类,我发现我已经为这些属性设置了“内部”访问器。将它们更改为“public”可解决绑定问题。谢谢安迪指点我正确的方向。 – Boris 2011-03-28 11:50:25
有解决Q2一些很好的建议,但对于Q1我建议你设置的DataContext的用户控件,然后ItemsControl中你可以使用ItemsSource="{Binding Path=Days}"
。
这允许您轻松地将DataContext替换为另一个DataContext,例如对您的控件进行简单的测试。这也意味着如果Days
或其他属性用于UserControl中的其他控件,则不需要重复ElementName标记。
此机制通常与Model-View-ViewModel(MVVM)设计模式(请参阅MSDN)一起使用,其中ViewModel是View的DataContext。
在你的榜样,你可以简单地设置的DataContext直接在XAML中,使用类似:
<UserControl DataContext="{Binding Path=CalendarMonthViewControl}}" ... />
或者你可以在其设置代码隐藏文件。
不同意,不需要在每个洞中放置MVVM模式。简单的控件应该以常规的方式实现,MVVM不会让它更容易,可能会变得更糟。 OP对依赖属性的使用是正确的。你的答案似乎也不清楚,你没有回答第二个问题,对于第一个问题,你只有几个关于**应该改变的词。你不会说如何和谁应该设置'DataContext'。 – Snowbear 2011-03-28 06:23:24
@Snowbear,你会同意我以可推荐的方式绑定依赖属性'Days'到'ItemsControl'吗?这种绑定工作,但我希望提高我的技能,所以也许使用'DataContext'是一个更好的解决方案? – Boris 2011-03-28 09:07:37
@Boris,国际海事组织,你的方式来绑定它是正确的,还有其他稍微不同的选项,但他们不会给你很多好处。如果我写这样的控制,我会用你选择的方法,我没有看到更好的。附:抱歉在垃圾邮件中回答。 – Snowbear 2011-03-28 09:12:21
@Boris当你说“不会绑定”,你的意思是你没有看到这些属性的初始值(并且VS的输出窗口显示绑定错误),或者没有显示对这些属性的更改? – grantnz 2011-03-28 02:04:26
@grantnz我的意思是当我运行应用程序时,'TextBlock'和'ItemsControl'没有显示任何数据,'DayOfMonth'值和'CalendarDayItems'列表没有显示。他们只是空白的,但没有错误或例外。 – Boris 2011-03-28 02:10:32
就好像绑定尝试在控件上找到那些属性,而不是在集合中的“日”项...... – Boris 2011-03-28 02:11:36