2011-03-28 140 views
1

我创建了一个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> 
... 

我有几个问题:

  1. 我使用的正确方法到dependecy属性绑定到ItemsControl,即是它推荐给命名控件,然后引用它是一个有约束力的来源?
  2. 主要问题是TextBlock和第二个ItemsControl将分别不与DayOfMonthCalendarDayItems类别的属性绑定。
+0

@Boris当你说“不会绑定”,你的意思是你没有看到这些属性的初始值(并且VS的输出窗口显示绑定错误),或者没有显示对这些属性的更改? – grantnz 2011-03-28 02:04:26

+0

@grantnz我的意思是当我运行应用程序时,'TextBlock'和'ItemsControl'没有显示任何数据,'DayOfMonth'值和'CalendarDayItems'列表没有显示。他们只是空白的,但没有错误或例外。 – Boris 2011-03-28 02:10:32

+0

就好像绑定尝试在控件上找到那些属性,而不是在集合中的“日”项...... – Boris 2011-03-28 02:11:36

回答

1

如果您在调试器中运行您的应用程序,则任何带绑定的错误都将显示在“输出”窗口中。这可以用来找出为什么绑定不起作用。

+0

在输出窗口中,我发现'DayOfMonth'和'MonthEntries'是不存在的属性。一旦我检查了“Day”类,我发现我已经为这些属性设置了“内部”访问器。将它们更改为“public”可解决绑定问题。谢谢安迪指点我正确的方向。 – Boris 2011-03-28 11:50:25

0

有解决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}}" ... /> 

或者你可以在其设置代码隐藏文件。

+0

不同意,不需要在每个洞中放置MVVM模式。简单的控件应该以常规的方式实现,MVVM不会让它更容易,可能会变得更糟。 OP对依赖属性的使用是正确的。你的答案似乎也不清楚,你没有回答第二个问题,对于第一个问题,你只有几个关于**应该改变的词。你不会说如何和谁应该设置'DataContext'。 – Snowbear 2011-03-28 06:23:24

+0

@Snowbear,你会同意我以可推荐的方式绑定依赖属性'Days'到'ItemsControl'吗?这种绑定工作,但我希望提高我的技能,所以也许使用'DataContext'是一个更好的解决方案? – Boris 2011-03-28 09:07:37

+0

@Boris,国际海事组织,你的方式来绑定它是正确的,还有其他稍微不同的选项,但他们不会给你很多好处。如果我写这样的控制,我会用你选择的方法,我没有看到更好的。附:抱歉在垃圾邮件中回答。 – Snowbear 2011-03-28 09:12:21

相关问题