[英]Confusion about WPF binding
我試圖將排列在堆棧面板中的2D按鈕數組綁定到2D ObservableCollection ...
但是,恐怕我對綁定不是很了解。
我的XAML:
<Window.Resources>
<DataTemplate x:Key="ItemsAsButtons">
<Button Content="{Binding}" Height="100" Width="100"/>
</DataTemplate>
<DataTemplate x:Key="PanelOfPanels">
<ItemsControl ItemsSource="{Binding Path=DayNumbers}" ItemTemplate=" {DynamicResource ItemsAsButtons}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</Window.Resources>
...
<ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
ItemTemplate="{DynamicResource PanelOfPanels}"/>
我的C#代碼:后端:
/// <summary>
/// Window BE for Calendar.xaml
/// </summary>
public partial class Calendar : Window
{
private CalendarViewModel _vm;
public Calendar()
{
InitializeComponent();
_vm = new CalendarViewModel();
this.DataContext = _vm;
}
}
ViewModel:
class CalendarViewModel
{
CalendarMonth _displayedMonth;
EventCalendar _calendar;
public CalendarViewModel()
{
_displayedMonth = new CalendarMonth();
}
public ObservableCollection<ObservableCollection<int>> DayNumbers
{
get
{
return _displayedMonth.DayNumbers;
}
}
}
我正在嘗試使用CalendarViewModel.DayNumbers中的值填充按鈕-但是按鈕沒有出現。 我的綁定顯然做錯了。
將所有DynamicResource
更改為StaticResource
。 這不應該停止它的工作,但是可能在運行時效率低下。 查看此頁面以獲取WPF資源概述。
此外,您的ItemsControl
也不綁定到DayNumbers
。 像這樣添加綁定:
<ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
ItemTemplate="{StaticResource PanelOfPanels}"
ItemsSource={Binding DayNumbers}/>
在“日歷”窗口上設置DataContext
時,將設置哪個對象將是整個窗口的默認綁定源。 您沒有指定ViewModel的哪個屬性綁定到ItemsControl
。 這就是上面的代碼所做的。
編輯因為要覆蓋ItemsControl
的項目模板並在那里提供收集容器,所以還需要為其提供ItemsSource
。 語法{Binding}
僅表示綁定到每個成員或枚舉 ,在本例中為ObservableCollection<int>
。
重申一下,模板就是這樣-用於顯示數據的模板。 它應該是可重用的,您應該能夠將其綁定到所需的任何模型。 經驗法則-綁定到實際數據的數據應在控件而不是模板上發生。
就像Igor所說的那樣,您需要在最外面的ItemsControl
指定ItemsSource={Binding DayNumbers}
,否則,它將綁定到DataContext
,后者是CalendarViewModel
,並且不是IEnumerable
。
一旦你這樣做,它將適用<DataTemplate x:Key="PanelOfPanels">
對於內部每個項目DayNumbers
。 需要注意的是DataContext
所述的DataTemplate
的每個元素中DayNumbers
,這是類型ObservableCollection<int>
。 在這里,您不能指定ItemsSource="{Binding Path=DayNumbers}"
因為DayNumbers
在ObservableCollection<int>
不是有效的屬性。 相反,由於ObservableCollection<int>
已經是IEnumerable
,所以最好不指定ItemsSource
因為默認情況下它將綁定到DataContext
。
最后,它進入最里面的<DataTemplate x:Key="ItemsAsButtons">
,您可以像執行操作一樣在此處放置按鈕。
希望它能澄清一點。 抱歉,我沒有環境進行測試並提供解決方案。
調試WPF綁定並不簡單。 一個技巧是您可以使用虛擬轉換器並在Convert
方法中設置斷點以查看其綁定。
public class DebugConverter1 : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
{Binding Converter={StaticResource debugConverter1}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.