Привязка WPF к простому свойству — не работает

#.net #wpf #xaml #binding

#.net #wpf #xaml #привязка

Вопрос:

У меня есть элемент управления, в котором я хочу привязать цвет к простому свойству в его собственном классе.

Но это не работает??? есть какие-нибудь подсказки?

У меня есть это

  public Brush SeperatorColour
    {
        get { return (Brush)GetValue(SeperatorColourProperty); }
        set { SetValue(SeperatorColourProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SeperatorColour.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SeperatorColourProperty =
        DependencyProperty.Register("SeperatorColour", typeof(Brush), typeof(TycoMessageBarMessage), new UIPropertyMetadata(Brushes.Crimson));
  

И это

     <StackPanel Orientation="Horizontal" Background="Black" >
    <Rectangle Name="MessageSeperator" Height="auto" Width="10" Fill="{Binding Path=SeperatorColour, ElementName=container, Mode=OneTime}"   />
    <TextBlock Name="MessageText" Text="Hello"  Foreground="White" Margin="5,0" />
</StackPanel>
  

Комментарии:

1. Надеюсь, вы устанавливаете DataContext

2. Посмотрите в окне вывода внутри Visual Studio в разделе debug. Должны быть ошибки привязки.

3. Один из тех вопросов, который можно легко решить, сначала поняв основы: msdn.microsoft.com/en-us/library/ms752347.aspx

Ответ №1:

ИмяэлемЕнта=контейнер

подразумевает, что вы привязываетесь к другому элементу XAML с именем ‘container’, вы, вероятно, захотите привязаться к какому-либо экземпляру объекта со свойством ‘SeperatorColour’.

Если вы не привязываетесь к другому элементу XAML, не добавляйте «ИмяэлемЕнта» к выражению привязки.

Комментарии:

1. Я удалил «ИмяэлемЕнта» — по-прежнему никакой радости

2. Нужно ли мне каким-то образом установить привязку данных к «this»?

3. Здесь важен контекст данных.

4. По умолчанию контекст данных равен «this». Вы можете задать контекст данных из исходного кода с помощью object.DataContext = otherObject; или из XAML (для ссылки на другой объект XAML) с помощью Datacontext="otherObject"

Ответ №2:

Вам либо нужно установить имя вашего элемента управления в container :

 <UserControl xmlns="..."
             x:Name="container">
  

Или используйте относительную привязку:

 Fill="{Binding Path=SeperatorColour, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyControl}}, Mode=OneTime}"
  

Здесь вместо MyControl вам нужно указать тип вашего элемента управления.

В случае, если это пользовательский элемент управления и показанный вами XAML расположен внутри шаблона элемента управления для элемента управления, тогда вы можете использовать TemplateBinding :

 Fill="{TemplateBinding SeperatorColour}"
  

Ответ №3:

Это должно работать идеально, если вы правильно установили DataContext для вашего UserControl —

  <Rectangle Name="MessageSeperator" Height="auto" Width="10" Fill="{Binding Path=SeperatorColour, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"   />
  

Что вы видите в окне вывода при запуске вашего приложения? Была ли какая-либо ошибка привязки данных??

Для отладки ваших привязок данных, пожалуйста, обратитесь к — http://bea.stollnitz.com/blog/index.php?s=presentationtrace