Итак, я пытаюсь создать пользовательский элемент управления для приложения Windows Phone 7, которое я называю ColoredTextBlock. Вероятно, вы можете догадаться, что он делает.Проблемы с привязкой WP7 к свойствам в пользовательском элементе управления пользователя
В любом случае, ColoredTextBlock содержит TextBlock, который я хочу, чтобы пользователь мог установить текст и стиль для.
Если я пытаюсь просто сделать простое свойство, которое как раз проходит через, например:
public string Text
{
get { return Label.Text; }
set
{
Label.Text = value;
NotifyPropertyChanged("Text");
}
}
Это вызывает очень загадочное ArgumentException. Однако, если я задаю входной текст, например:
<MyRepresentative:ColoredTextBlock Text="Some Text" BackgroundColor="Red" />
Все работает точно так, как я ожидал.
Если, с другой стороны, я перехожу к более продвинутому маршруту использования свойства Dependency и привязываю Inner TextBlock к этому свойству, а затем привязывая внешние данные к этому свойству, ничего не отображается.
public string Text
{
get { return (string)GetValue(TextProperty); }
set
{
SetValue(TextProperty, value);
NotifyPropertyChanged("Label");
}
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(ColoredTextBlock), null);
Опять же, если я вставляю текст вручную, все это просто работает.
Вот XAML моего таможенного контроля:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="MyRepresentative.ColoredTextBlock"
d:DesignWidth="456" d:DesignHeight="43"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid x:Name="LayoutRoot" Background="Transparent">
<Rectangle Stroke="Black">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="{Binding DimBackgroundColor}" Offset="0"/>
<GradientStop Color="{Binding BrightBackgroundColor}" Offset="0.85"/>
<GradientStop Color="{Binding BrightBackgroundColor}" Offset="0.15"/>
<GradientStop Color="{Binding DimBackgroundColor}" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{Binding Text}" Margin="5,0" d:LayoutOverrides="Width"/>
</Grid>
</UserControl>
Я ломал мой мозг на этом для большей части дня, и, глядя на так много различных статей, и я уверен в этот момент, что мне не хватает чего-то маленького, но я просто не могу его найти.
ОБНОВЛЕНИЕ 1: После того, как мы рассмотрим его далее, кажется, что по какой-то причине, хотя я установил его с привязками, не кажется, что это действительно установлено, по крайней мере, насколько я могу судить ,
ОБНОВЛЕНИЕ 2: На основании комментария вы спросили о том, что мой DataContext установлен правильно. Я, это была одна из первых вещей, о которых я думал. У меня есть строки ниже в моем xaml.
<MyRepresentative:ColoredTextBlock Text="{Binding Title}" BackgroundColor="Red" />
<TextBlock Text="{Binding Title}" Style="{StaticResource PhoneTextLargeStyle}" />
Так что первый элемент не отображается (на всех), если я не изменить что-то вроде Text="Some text"
. Второй элемент отлично работает без ошибок.
Вы не указали код, в котором вы устанавливаете DataContext (для работы {Binding}). Также вы уведомляете о неправильном имени свойства? (Вы называете NotifyPropertyChanged («Label») в свойстве «Text») –
Эй, Shahar, я попытался ответить на ваш комментарий в обновленных версиях. Проблема с именами состояла в том, что я пытался несколько раз попытаться заставить ее работать. Однако я все же убедился, что они были последовательными. –
Я имел в виду ваш datacontext внутри вашего контроля. Вы вернетесь вверху - но в вашем примере кода, который работает, вы привязываетесь к «Title», а в элементе управления вы привязываетесь к «Text» –