WPF: привязка к свойству зависимости - PullRequest
4 голосов
/ 28 июня 2010

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

<Binding ElementName="This" Path="IPAddress" UpdateSourceTrigger="PropertyChanged">

где «Это» - имя текущего окна:

<Window x:Class="SOTCBindingValidation.Window1" x:Name="This"

всякий раз, когда я пытаюсь сделать что-то подобное, я продолжаю получать ту же ошибку:

Не удается найти источник для привязки со ссылкой 'ElementName = GridControlControl1'.BindingExpression: Path = IPAddress;DataItem = NULL;целевой элемент - TextBox (Name = 'AddressBox');целевое свойство 'Text' (тип 'String')

мой код:

 <UserControl x:Class="WpfGridtest.GridControl" x:Name="GridControlControl1" ... />
    <TextBox x:Name="AddressBox">
        <TextBox.Text>
            <Binding ElementName="GridControlControl1" Path="IPAddress" UpdateSourceTrigger="PropertyChanged">
        </Binding>
    </TextBox.Text>
</TextBox>

codebehind:

partial class GridControl : UserControl
     public static readonly DependencyProperty IPAddressProperty = DependencyProperty.Register("IPAddress", typeof(string), typeof(GridControl), new UIPropertyMetadata("1.1.1.1"));

        public string IPAddress
        {
            get { return (string)GetValue(IPAddressProperty); }
            set { SetValue(IPAddressProperty, value); }
        }

почтичто-то изменилось в .Net 4.0?

Ответы [ 2 ]

6 голосов
/ 29 июня 2010

Это зависит от того, что вы хотите.Я постараюсь предложить полный ответ.Один из способов гарантировать лучший успех с этим синтаксисом - использовать XAML Binding Builder VS2010 , как я и собирал синтаксис, который вы увидите.

Если вы хотите, чтобы элемент UserControl отображал ваше свойство зависимостей IPAddress, (мне кажется, оно определено правильно), используйте этот синтаксис в теле разметки UserControl:

   <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, 
                             AncestorType={x:Type my:GridControl}, 
                             AncestorLevel=1}, 
              Path=IPAddress}" />

Большинство примеров связывания XAML используют этот синтаксис, а не более подробный иерархический XML:

        <TextBlock>
            <TextBlock.Text>
                <Binding Path="IPAddress">
                    <Binding.RelativeSource>
                        <RelativeSource Mode="FindAncestor" 
                                        AncestorType="{x:Type my:GridControl}"
                                        AncestorLevel="1" 
                        />
                    </Binding.RelativeSource>
                </Binding>
            </TextBlock.Text>
        </TextBlock>

... но оба вида синтаксиса дают одинаковые результаты. Обратите внимание, что AncestorType - это имя класса вашего UserControl, а не x:Name, который вы указали бы при использовании UserControl в другой разметке.

Предположим, у вас естьЭлемент пользовательского интерфейса в разметке вне вашего UserControl, и вы хотите получить доступ к вашему DependencyProperty для этого другого элемента управления .Разметка выглядит примерно так:

    <my:GridControl 
       x:Name="GridControl1" IPAddress="192.168.1.1" />
    <TextBox Text="{Binding ElementName=GridControl1, Path=IPAddress}"/>

Или, альтернативно, это:

    <TextBox>
        <TextBox.Text>
            <Binding ElementName="GridControl1" Path="IPAddress"/>
        </TextBox.Text>
    </TextBox>

Обратите внимание, что на этот раз вы используете свойство x:Name объектаGridControl, а не имя класса, и то, что вы называете его ElementName, а не "Ancestor". В обоих случаях Path является объявленным именем свойства DependencyProperty, которое вы определили.

3 голосов
/ 28 июня 2010

Попробуйте использовать RelativeSource:

<TextBox>
  <TextBox.Text>
    <Binding Path="IPAddress">
      <Binding.RelativeSource>
        <RelativeSource
           Mode="FindAncestor"
           AncestorType="{x:Type UserControl}"
           AncestorLevel="1"
        />
      </Binding.RelativeSource>
    </Binding>
  </TextBox.Text>
</TextBox>

Вместо {x:Type UserControl} вы можете вставить свой фактический тип, то есть:

<TextBox>
  <TextBox.Text>
    <Binding Path="IPAddress">
      <Binding.RelativeSource>
        <RelativeSource xmlns:my="clr-namespace:WpfGridtest"
           Mode="FindAncestor"
           AncestorType="{x:Type my:GridControl}"
           AncestorLevel="1"
        />
      </Binding.RelativeSource>
    </Binding>
  </TextBox.Text>
</TextBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...