#.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