Изменить текстовый блок UserControl из другого WPC UserControl - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть UserControl, который содержит TextBox, теперь я загружаю другой UserControl, который содержит TextBlock. Когда кнопка нажата, я хочу присвоить значение, введенное в TextBox, TextBlock другого элемента управления, который загружен. Как я могу это сделать?

Основной пользовательский контроль

<UserControl x:Class="IntelliVentory.UserControls.CategoryControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
         mc:Ignorable="d" 
         d:DesignHeight="670" d:DesignWidth="1100">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>  
        <TextBox Grid.Row="0" Name="CategoryNameBox" Width="350" />
        <Button Grid.Row="1" Click="AddCategoryFunc">Load Another Control</Button>
        <Grid Grid.Row="2" Name="CategoriesWraper"></Grid>
    </Grid>
</UserControl>  

Другой пользовательский контроль

<UserControl x:Class="IntelliVentory.UserControlModules.CategoryModule"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:IntelliVentory.UserControlModules"
         xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBlock Name="CategoryName" FontSize="12" FontWeight="Thin">Category Name Here</TextBlock>
    </Grid>
</UserControl>  

Main UserControl.cs Загрузка другого UserControl.

private void AddCategoryFunc(object sender, RoutedEventArgs e)
{
    UserControl categoryMod = new CategoryModule();
    CategoriesWraper.Children.Add(categoryMod);
}

1 Ответ

0 голосов
/ 01 сентября 2018

Вы хотите иметь что-то вроде

categoryMod.CategoryNameValue = categoryControl.CategoryNameValue;

Таким образом, вам нужно определить два свойства: одно свойство CategoryNameValue, с которым вы получите текстовое значение TextBox, и одно свойство CategoryNameValue, с которым вы можете установить свойство Text элемента TextBlock.

Определите это свойство в классе CategoryControl,

public string CategoryNameValue { get { return CategoryNameBox.Text; }

И это в классе CategoryModule,

public string CategoryNameValue { set { CategoryName.Text = value; }

И вы можете начать использовать их в своем коде.

Вы можете определить их как Свойства зависимостей вместо простых свойств CLR, а затем использовать привязку данных . При связывании данных оба пользовательских элемента управления могут быть привязаны к одной и той же модели данных, поэтому их значения синхронизируются автоматически.

Редактировать:

Оказывается, вы можете получить доступ к дочерним элементам UserControl извне, как если бы они были открытыми полями. То есть вы можете написать такой код без необходимости определять новые свойства

CategoryModule categoryMod = new CategoryModule();
categoryMod.CategoryName.Text = CategoryNameBox.Text; 
CategoriesWraper.Children.Add(categoryMod);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...