簡體   English   中英

WPF動態將數據綁定到另一個用戶控件內的用戶控件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM