2012-03-19 4 views
0

Итак, я пытаюсь создать пользовательский элемент управления для приложения 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". Второй элемент отлично работает без ошибок.

+0

Вы не указали код, в котором вы устанавливаете DataContext (для работы {Binding}). Также вы уведомляете о неправильном имени свойства? (Вы называете NotifyPropertyChanged («Label») в свойстве «Text») –

+0

Эй, Shahar, я попытался ответить на ваш комментарий в обновленных версиях. Проблема с именами состояла в том, что я пытался несколько раз попытаться заставить ее работать. Однако я все же убедился, что они были последовательными. –

+0

Я имел в виду ваш datacontext внутри вашего контроля. Вы вернетесь вверху - но в вашем примере кода, который работает, вы привязываетесь к «Title», а в элементе управления вы привязываетесь к «Text» –

ответ

0

Я в конечном итоге сам выяснил ответ на эту проблему, хотя мне потребовалось некоторое время и немного поискать. Ответ был фактически вдохновлен this answer.

Ответ:

Вместо того, чтобы связываться с корневого элемента с помощью:

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

Такие, как я сделал в приведенном выше примере:

<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}}"> 

Bind вместо того, чтобы к LayoutRoot, в этом случае, мой элемент сетки.

<Grid x:Name="LayoutRoot"> 

Это можно сделать в коде позади, в конструкторе, как я сделал здесь:

public ColoredTextBlock() 
    { 
     ... 
     LayoutRoot.DataContext = this; 
     ... 
    } 

Объяснение:

Я не совсем понимаю, почему это работает в быть честным, и если кто-то может это объяснить, отредактируйте.

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

Надеюсь, что это поможет другим, кто сталкивается с той же проблемой, что и я!

2

У меня была настоящая проблема с тем же, что и вы, и мне не повезло, единственные записи, которые я нашел, говорили о том, что этот подход не работает (извините, я не могу их больше найти).

У меня был успех, если я установил привязки через C#. У меня есть пример этого shared here.

Редактировать: Еще одно решение, которое я только что нашел, - использовать Element Name bindings.

+0

Спасибо за ваши предложения. Я проверил их обоих. К сожалению, они, похоже, не дают мне лучших результатов, чем то, что я получаю прямо сейчас :( –