如何将依赖项属性绑定到WPF中的控件?

时间:2011-03-28 01:56:44

标签: wpf binding

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

我有几个问题:

  1. 我是否使用正确的方法将依赖属性绑定到ItemsControl,即是否建议命名控件然后将其作为绑定源引用?
  2. 主要问题是TextBlock和第二个ItemsControl不会分别绑定到DayOfMonth类的CalendarDayItemsDay属性。

2 个答案:

答案 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}}" ... />

或者您可以在其中设置文件背后的代码。