[英]WPF bind data to user control inside another user control dynamically
綁定問題。 如何正確將數據綁定到另一個用戶控件內的用戶控件?
所以我有一個問題,對我來說是一個大問題。 我正在WPF中制作一個計划程序。 為了縮小范圍,我有兩個類(Day和Shift)來保存我的數據(簡化)。 日班包含班次列表。 正常的一天可以包含各種輪班,即一次從9到14,另一次從18到22。
class Shift
{
public string StartTime { get; set; }
}
class Day
{
List<Shift> Shifts { get; set; }
}
然后,我有兩個用戶控件,一個“ DayControl”和一個“ ShiftControl”:
<UserControl x:Class="Spas.DayControl" ...>
<StackPanel x:Name="MyShifts"... />
</UserControl>
<UserControl x:Class="Spas.ShiftControl" x:Name="uc"...>
<TextBox x:Name="tb_startTime" Text="{Binding StartTime, ElementName=uc, Mode=TwoWay}" />
</UserControl>
在ShiftControl.xaml.cs中:
public static DependencyProperty StartTimeProperty = DependencyProperty.Register("StartTime", typeof(string), typeof(ShiftControl), new PropertyMetadata("09:00", null, CoerceStartTimeValue));
public string StartTime
{
get { return (string)GetValue(StartTimeProperty); }
set { SetValue(StartTimeProperty, value); }
}
所以我想做的是:在我的主要代碼中,我將用動態的Shifts填充Day。 那是容易的部分。 從那里,我希望DayControl動態創建與Shift數量一樣多的ShiftControl,並將它們添加到DayControl的stackpanel中。 我已經使用DayControl的DataContextChanged做到了這一點。
主要代碼:
public Day MyDay { get; set; }
private void CreateADay()
{
MyDay = new Day();
MyDay.Shifts.Add(new Shift1() { StartTime = "09:00" });
MyDay.Shifts.Add(new Shift1() { StartTime = "14:00" });
dc1.DataContext = MyDay; // which is my DayControl in MainWindow
}
而我的DayControl:
private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Day day = e.NewValue as Day;
foreach (var item in day.Shifts)
{
ShiftControl ctrl = new ShiftControl();
// here I somehow want to bind item.StartTime to ctrl.StartTime
// This doesn't work:
// Binding binding = new Binding("ShiftControl.StartTimeProperty");
// binding.Source = item.StartTime;
// binding.Mode = BindingMode.TwoWay;
// ctrl.SetBinding(ShiftControl.StartTimeProperty, binding);
_shifts.Children.Add(ctrl);
}
}
但是絕對不能將Shift數據綁定(雙向)到ShiftControl中的tb_startTime。 幾天來,我一直在為此苦苦掙扎,我可能只是盲目。 幫助任何人? 如果需要,我可以將整個項目放在某個地方。
示例方法以實現您的權益。 您應該像下面那樣設計它。 將班次對象作為itemsource分配給“ DayControl”用戶控件的itemsPanel。 在這里,我將Itemspanel與stackpanel一起用作ItemPanleTemplate。
<UserControl x:Class="Spas.DayControl" >
<ItemsControl x:Name="MyShifts" ItemsSource="{Binding ShiftObjects}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:Spas.ShiftControl />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</UserControl>
如果要在后面綁定代碼,則:
private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Day day = e.NewValue as Day;
foreach (var item in day.Shifts)
{
ShiftControl ctrl = new ShiftControl();
// here I somehow want to bind item.StartTime to ctrl.StartTime
Binding myBinding = new Binding("StartTime");
myBinding.Source = item;
ctrl.SetBinding(ShiftControl.StartTimeProperty, myBinding);
_shifts.Children.Add(ctrl);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.