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

时间:2014-06-18 09:40:07

标签: c# wpf data-binding

绑定问题。如何正确地将数据绑定到另一个用户控件中的用户控件?

所以我有一个问题,对我来说很重要。我在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。几天后我一直在为此而烦恼,我可能只是失明了。帮助任何人?如果需要,我可以将我的整个项目放在某处。

2 个答案:

答案 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);
 }
}