绑定问题。如何正确地将数据绑定到另一个用户控件中的用户控件?
所以我有一个问题,对我来说很重要。我在WPF制作了一个计划程序。 为了缩小范围,我有两个类(Day和Shift)来保存我的数据(简化)。 Day类包含Shift列表。常规日可以包含不同数量的班次,即一个从9到14,另一个从18到22。
class Shift
{
public string StartTime { get; set; }
}
class Day
{
List<Shift> Shifts { get; set; }
}
然后我有两个用户控件,一个&#34; DayControl&#34;和&#34; ShiftControl&#34;:
<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填充我的一天。这很容易。 从那里我希望我的DayControl动态创建尽可能多的ShiftControls作为Shifts的数量,并将它们添加到我的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);
}
}
但是我无法在我的ShiftControl中将我的Shift数据绑定(twoway)到tb_startTime。几天后我一直在为此而烦恼,我可能只是失明了。帮助任何人?如果需要,我可以将我的整个项目放在某处。
答案 0 :(得分:0)
实现您的需求的示例方法。你应该像下面这样设计它。将shift对象作为itemsource分配给“DayControl”usercontrol的itemsPanel。在这里,我使用了带有stackpanel的Itemspanel作为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>
答案 1 :(得分:0)
如果你想在后面绑定代码:
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);
}
}