WPF动态地将数据绑定到另一个用户控件中的用户控件
本文关键字:用户 控件 另一个 动态 数据绑定 WPF | 更新日期: 2023-09-27 18:09:20
绑定问题。如何正确地将数据绑定到另一个用户控件中的用户控件?
所以我有一个问题,对我来说是一个大问题。我在WPF中做一个日程表程序。为了缩小范围,我有两个类(Day和Shift)来保存我的数据(简化)。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); }
}
所以我想做的是:在我的主代码中,我将用动态的班次填充我的一天。这是简单的部分。从那里,我希望我的DayControl动态地创建尽可能多的shift控件,并将它们添加到我的DayControl的堆栈面板。我已经设法做到这一点,使用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数据tb_startTime在我的ShiftControl。我已经为此挣扎了好几天了,我可能只是瞎了。帮助任何人吗?如果需要的话,我可以把我的整个项目放到某个地方。
如果你想在后面绑定代码:
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);
}
}
示例方法来实现您的需求。你应该像下面这样设计它。将shift对象作为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>