Как получить дочерние объекты DataTemplate с помощью ContentControl - PullRequest
0 голосов
/ 07 мая 2020

У меня есть DataTemplate в Page.Resources, представляющий структуру таблиц и их связанный номер в ресторане:

<DataTemplate x:Key="Table">
    <RelativePanel x:Name="container" Height="40" Width="40">
        <TextBlock x:Name="number" RelativePanel.AlignHorizontalCenterWithPanel="True" RelativePanel.AlignVerticalCenterWithPanel="True"/>
    </RelativePanel>
</DataTemplate>

В XAML я использую ContentControl, потому что мне нужно повторять ту же структуру, избегая копирования и вставки :

<ContentControl ContentTemplate="{StaticResource Table}" Canvas.Top="200" Canvas.Left="100"/>
<ContentControl ContentTemplate="{StaticResource Table}" Canvas.Top="150" Canvas.Left="300"/>

Затем у меня есть кнопка для динамического добавления нового ContentControl (Table) в код программной части

private void NewTable(object sender, RoutedEventArgs e)
        {
            ContentControl tavolo = new ContentControl();
            tavolo.ContentTemplate = (DataTemplate)this.Resources["Table"];
            //here i Want to take the textblock called "number" and change his text.
            Canvas.SetTop(tavolo, 150);
            Canvas.SetLeft(tavolo, 150);
            sala.Children.Add(tavolo);
        }

Но если я хочу изменить текст текстового блока, называемого «число» что мне делать в этой функции (только для этой новой таблицы, а не для всех остальных ContentControl)? Как решить эту проблему с помощью привязки данных?

Более того, как лучше всего решить проблему «копипаста»? Стоит ли использовать другие структуры, такие как Usercontrols? Надеюсь, что кто-то ответит на все эти вопросы. Я очень запутался и застрял

1 Ответ

0 голосов
/ 07 мая 2020

Как получить дочерние объекты DataTemplate с помощью ContentControl

Я обнаружил, что вы добавляете ContentControl динамически в коде программной части. Для этого сценария лучше использовать VisualTreeHelper, чтобы найти ребенка.

public static DependencyObject MyFindChildByName(DependencyObject parant, string ControlName)
{
    int count = VisualTreeHelper.GetChildrenCount(parant);

    for (int i = 0; i < count; i++)
    {
        var MyChild = VisualTreeHelper.GetChild(parant, i);
        if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
            return MyChild;

        var FindResult = MyFindChildByName(MyChild, ControlName);
        if (FindResult != null)
            return FindResult;
    }

    return null;
}

Использование

private void AppBar_Tapped(object sender, TappedRoutedEventArgs e)
{
    ContentControl tavolo = new ContentControl();
    tavolo.ContentTemplate = (DataTemplate)this.Resources["Table"];
    //here i Want to take the textblock called "number" and change his text.
    Canvas.SetTop(tavolo, 150);
    Canvas.SetLeft(tavolo, 150);
    tavolo.Loaded += Tavolo_Loaded;  
    sala.Children.Add(tavolo);
}

private void Tavolo_Loaded(object sender, RoutedEventArgs e)
{
    var textblcok = MyFindChildByName(sender as ContentControl, "number") as TextBlock;
    textblcok.Text = "New Content";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...