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。我已经为此挣扎了好几天了,我可能只是瞎了。帮助任何人吗?如果需要的话,我可以把我的整个项目放到某个地方。

WPF动态地将数据绑定到另一个用户控件中的用户控件

如果你想在后面绑定代码:

 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>