UserControl的所有实例都显示为最后一个实例指定的属性值

时间:2015-08-22 13:21:45

标签: c# wpf xaml user-controls win-universal-app

我创建了一个UserControl,它是(在其最小化形式中,为了这个问题)一个Grid内的TextBlock。其Text属性绑定到代码隐藏中名为DependencyProperty的{​​{1}}。

在我的主XAML页面上,我将此控件放在TitleText

中4次
Grid

问题是在设计时,所有这些控件中的文本显示 last 实例的值!

截屏:

3/4 UserControls displaying wrong property value

我的UserControl的相关XAML如下所示:

<usercontrols:ProgramButton TitleText="Top left"     Grid.Row="0" Grid.Column="0" x:Name="pbTopLeft" />
<usercontrols:ProgramButton TitleText="Bottom left"  Grid.Row="1" Grid.Column="0" x:Name="pbBottomLeft" />
<usercontrols:ProgramButton TitleText="Top right"    Grid.Row="0" Grid.Column="1" x:Name="pbTopRight" />
<usercontrols:ProgramButton TitleText="Bottom right" Grid.Row="1" Grid.Column="1" x:Name="pbBottomRight" />

我的UserControl的相关代码隐藏如下:

<UserControl
    ...
    x:Name="Root"
    ...
>

<Grid Background="Gray" Padding="25">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" x:Name="TitleTextbox" 
        Foreground="DarkGray" 
        FontSize="40"
        HorizontalAlignment="Center"
        Text="{Binding ElementName=Root, Path=TitleText}" />
</Grid>

我似乎无法找出为什么每个控件实例都显示“右下角”。 UserControl的“Root”为public string TitleText { get { return TitleTextBox.Text; } set { SetValue(TitleTextProperty, value); } } public static readonly DependencyProperty TitleTextProperty = DependencyProperty.Register( "TitleText", typeof(string), typeof(ProgramButton), new PropertyMetadata( new PropertyChangedCallback(TitleTextCallback))); public static void TitleTextCallback( DependencyObject o, DependencyPropertyChangedEventArgs e) { (o as ProgramButton).TitleTextBox.Text = e.NewValue.ToString(); } 值,用作绑定x:Name的{​​{1}}。这又被声明为ElementName,注册为“TitleText”。每个都有一个唯一的Path=TitleText标识符,所以我不知道为什么这不能按预期工作。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

对于初学者来说,TitleTextCallback是不必要的,因为已经设置了与TitleText的绑定。 TitleText的Getter应如下所示:

get { return (string)GetValue(TitleTextProperty); }