Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Binding из ControlTemplate


Автор: Человек01 14.3.2009, 10:44
В продолжение нарисовалсявопрос:
В ResourceDictionary, расположенном в TextBox.xaml, определяю стиль для public class ElTextBox : TextBox

Код

<Style x:Key="textbox001" TargetType="{x:Type evrika:ElTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type evrika:ElTextBox}">
                    <Border 
                        Name="Border"
                        CornerRadius="2" 
                        Padding="2"
                        Background="Blue"
                        BorderThickness="1" 
                        Tag="тага тага"
                        >
                        <ScrollViewer Tag="hhhhhellloo" Margin="0" x:Name="PART_ContentHost"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="TextBox.Text" Value="">
                            <Setter TargetName="PART_ContentHost" Property="Background">
                                <Setter.Value>
                                    <VisualBrush TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
                                        <VisualBrush.Visual>
                                            <Label FontStyle="Italic">
                                                <Label.Content>
                                                    <Binding Path="Tag">
                                                        <Binding.RelativeSource>
 <!-- Вопрос ТУТ -->                              <RelativeSource Mode="FindAncestor" AncestorType="{x:Type evrika:ElTextBox}" />
                                                        </Binding.RelativeSource>
                                                    </Binding>
                                                </Label.Content>
                                            </Label>
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


В отдельном классе соответственно:
    
Код

public class ElTextBox : TextBox
    {
          public ElTextBox()
            : base()
         {
             this.Loaded += new RoutedEventHandler(ElTextBox_Loaded);
         }


         void ElTextBox_Loaded(object sender, RoutedEventArgs e)
        {
             Uri stUri = new Uri("/test01;component/TextBox.xaml", UriKind.RelativeOrAbsolute);
             ResourceDictionary rdic = (ResourceDictionary)Application.LoadComponent(stUri);
             this.Tag = "hello"; 
             this.Style = (Style)rdic["textbox001"];
        }
   }

Но не получается забиндить:
Цитата

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='test01.ElTextBox', AncestorLevel='1''. BindingExpression:Path=Tag; DataItem=null; target element is 'Label' (Name=''); target property is 'Content' (type 'Object')


Что не так делаю? Вроде уже всё перепробовал...

причем вопрос кроется вот тут:
Код

<Binding Path="Tag">
         <Binding.RelativeSource>
                   <RelativeSource Mode="FindAncestor" AncestorType="{x:Type evrika:ElTextBox}" />
         </Binding.RelativeSource>
</Binding>

Если его убрать и поставить что нить типо Привет всё работает, собственно проблема в биндинге. И не могу понять что не так делаю...

Автор: Partizan 14.3.2009, 11:15
Человек01Модератор: Пожалуйста, один топик - один вопрос.

Добавлено через 4 минуты и 32 секунды
Человек01, в первой строке очепятка по-видимому?

Автор: Человек01 14.3.2009, 11:36
Partizan, По поводу модерирования: скопировать данный вопрос в отдельною тему(Просто изначально мне показалось что проблема связанна с тем что использую ResourceDictionary, но как видимо выходит, что нет)? 
Цитата

Человек01, в первой строке очепятка по-видимому? 

Если по поводу ExTextBox, то да везде используется ElTextBox

Автор: Partizan 14.3.2009, 12:40
Человек01,  могу сказать, что надо искать другие пути получения необходимого функционала...ибо в этом варианте биндинг не заработает, ибо Label не находится в Visual Tree текстбокса....и не будет

Автор: Человек01 14.3.2009, 13:13
Ладно допусти Label не находится в Visual Tree текстбокса.
Тогда добавим в ElTextBox
Код

        public Brush zalivka
        {
            get { return Brushes.Red; }
            set { this.SetValue(zalivkaProperty, value); }
        }
        public static readonly DependencyProperty zalivkaProperty = DependencyProperty.Register(
                "zalivka", typeof(Brush), typeof(ElTextBox), new PropertyMetadata(null));


И заменим:
Код

<Setter TargetName="PART_ContentHost" Property="Background">
.....
</Setter>

На это:
Код

<Setter TargetName="PART_ContentHost" Property="Background" Value="{Binding Path=ElTextBox.zalivka}"/>


Но всё равно не работает, моя не понимать...

Автор: Partizan 14.3.2009, 13:16
Человек01, о.О а вам Path у биндинга странноватым не кажется?

Добавлено через 1 минуту и 39 секунд
я к тому, что вроде бы как в качестве source должен получиться объект типа ElTextBox, а в Path должно быть только zalivka...

Автор: Человек01 14.3.2009, 13:20
Код

<Setter TargetName="PART_ContentHost" Property="Background">
    <Setter.Value>
        <Binding Path="zalivka">
           <Binding.RelativeSource>
              <RelativeSource Mode="FindAncestor" AncestorType="{x:Type evrika:ElTextBox}"/>
           </Binding.RelativeSource>
        </Binding>
    </Setter.Value>
</Setter>

Так правильнее?
P.S.:Дико извиняюсь если докучаю, но правда я что то вообще не могу понять почему я не могу доломиться до свойств ElTextBox к которому и применяю Style

Автор: Partizan 14.3.2009, 13:24
Человек01

Код

                                <Setter.Value>
                                    <Binding Path="zalivka">
                                        <Binding.RelativeSource>
                                            <RelativeSource Mode="TemplatedParent"/>
                                        </Binding.RelativeSource>
                                    </Binding>
                                </Setter.Value>

Автор: Человек01 14.3.2009, 13:29
Работает  smile 
Partizanогромнейшее спасибо, а я из пустого в порожнее переливал...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)