2011-03-28 142 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

相關問題