Получить контроль в коде из ControlTemplate по имени - PullRequest
1 голос
/ 12 мая 2010

У меня есть следующий шаблон управления в моем приложении WPF.

    <Style TargetType="Label" x:Key="LabelStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="40"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <TextBox x:Name="MyTextBlock" Text="{TemplateBinding Content}"  Height="20" HorizontalAlignment="Left"  VerticalAlignment="Top" />
                        <Label Content="{TemplateBinding Content}" Grid.Column="1" Grid.Row="1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

TextBox "MyTextBlock" невидим в C # коде окна. Как я могу получить доступ к этому текстовому блоку в коде

Ответы [ 3 ]

4 голосов
/ 12 мая 2010

Попробуйте связать вашу собственность напрямую с видимостью текстового поля

<TextBox Visibility="{Binding IsFieldCodesEnabled, Converter={StaticResource BoolToVis}}" />

где BoolToVis определяется как:

<Resouces> 
    <loc:BooleanToVisibilityConverter k:key="BoolToVis"/> 
</Resources>
1 голос
/ 12 мая 2010

Я нашел решение для моей ситуации. Я просто использую загруженное событие TextBox в моей ControlTemplate

    private void MyTextBlock_Loaded(object sender, RoutedEventArgs e)
    {
        TextBox txt = sender as TextBox;
        if (txt!=null)
         {
            Messagebox.Show("It works");
         }

    }

Но это не очень красивое решение.

1 голос
/ 12 мая 2010

Вы можете сделать то же самое, что и страницы XAML в коде (за исключением того, что вам нужно сделать это в OnApplyTemplate переопределении):

public override void OnApplyTemplate() {
    base.OnApplyTemplate();

    var MyTextBlock = this.GetTemplateChild("MyTextBlock")
}

EDIT Только что заметил, что MyTextblock на самом деле является TextBox, поэтому приведение TextBox к TextBlock вызовет исключение. Попробуйте обновленный код.

...