WPF - Привязка к сообщениям о проблемах в тексте пользовательского элемента управления - PullRequest
5 голосов
/ 01 декабря 2010

Я нахожусь в процессе создания простого пользовательского элемента управления; просто кнопка ImageButton.

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

Вот XAML для моего контроля:

<Button x:Class="BCOCB.DACMS.Controls.ImageButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
        Name="this"
        Style="{StaticResource DisabledButton}">

    <Image Source="{Binding ElementName=this, Path=Source}" />    
    <Button.ToolTip>
        <TextBlock Text="{Binding ElementName=this, Path=ToolTipText}" />
    </Button.ToolTip>
</Button>

А вот информация о свойствах зависимости для текста всплывающей подсказки:

public static readonly DependencyProperty ToolTipTextProperty = DependencyProperty.Register("ToolTipText", typeof(string), typeof(ImageButton));
public string ToolTipText
{
  get
  {
    return this.GetValue(ToolTipTextProperty) as string;
  }
  set
  {
    this.SetValue(ToolTipTextProperty, value);
  }
}

И, наконец, объявление элемента управления в моем окне:

<controls:ImageButton x:Name="btnAdd" Source="/DACMS;component/Resources/plus.png" ToolTipText="Add New Item" Click="btnAdd_Click" />

Как я уже упоминал ранее, изображение отлично связывается, и я сделал это точно так же.

Есть идеи?

Спасибо,
Sonny

РЕДАКТИРОВАТЬ: у меня это работает сейчас. Я удалил ElementName из привязки и установил значение TextBlock DataContext = this в коде на момент создания. Тем не менее, я хотел бы знать, как исправить это в XAML.

Ответы [ 5 ]

6 голосов
/ 01 декабря 2010

Я не могу проверить это прямо сейчас, но вы можете попробовать:

<Button.ToolTip
      DataContext=”{Binding Path=PlacementTarget.Parent.Parent,
                    RelativeSource={x:Static RelativeSource.Self}}"
>
    <TextBlock Text="{Binding Path=ToolTipText}" />
</Button.ToolTip>

Возможно, вам придется немного поэкспериментировать с числом "Parent" в PlacementTarget.

Надеюсь, это работает. Я не люблю давать ответы, которые я не проверял, но у меня нет VS на этом компьютере. :)

2 голосов
/ 01 декабря 2010

У меня была такая же проблема с привязкой к ContextMenu.После моих исследований я думаю, что это потому, что ToolTip и ContextMenu не существуют в визуальном дереве вашей страницы / окна / элемента управления.И поэтому DataContext не наследуется и делает связывание проблематичным.

Вот хак Xaml, который я нашел, который работал для меня.*

1 голос
/ 06 декабря 2010

Способ установки контекста данных на «this» через xaml выглядит следующим образом:

<Control DataContext={Binding RelativeSource={RelativeSource Self}}>

В качестве другого пункта, кнопки wpf позволяют своему содержимому быть практически любой (единственной) вещью, которую вы хотите.Если вам нужно что-то, кроме текста (например, текст и изображение), это выглядит так:

<Button Name="SampleButton" Click="SampleButton_Click">
    <Grid Width="70" Height="62">
        <Label Content="SampleText"/>
        <Image Margin="3,3,3,3" Source="Graphics/sample.ico"/>
    </Grid>
</Button>
0 голосов
/ 29 апреля 2016

Это устраняет проблему со свойствами привязок и зависимостей всплывающей подсказки:

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls"
    x:Name="UserControl"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <TextBox x:Name="textBox">
        <TextBox.ToolTip>
            <ToolTip Content="{Binding Path=CustomToolTip}" Background="Yellow"/>
        </TextBox.ToolTip>
    </TextBox>
</UserControl>

Вместо этого (не работает):

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls"
    x:Name="UserControl">
    <TextBox x:Name="textBox">
        <TextBox.ToolTip>
            <ToolTip Content="{Binding ElementName=UserControl, Path=CustomToolTip}" Background="Yellow"/>
        </TextBox.ToolTip>
    </TextBox>
</UserControl>
0 голосов
/ 02 декабря 2010

Поскольку вы ничего не меняете, кроме текста в всплывающей подсказке TextBlock, вы можете просто использовать встроенное объявление, которое сгенерирует TextBlock для вас и не требует каких-либо взломов, чтобы обойти проблему определения имен, с которой вы столкнулись.в противном случае:

<Button ... ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=ToolTipText}">...

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

<Image DataContext="{Binding ElementName=this}" Source="{Binding Source}">
    <Image.ToolTip>
        <TextBlock FontSize="18" Text="{Binding Path=ToolTipText}" />
    </Image.ToolTip>
</Image>

Этот способ позволяет использовать дополнительные настройки для TextBlock или более сложных визуальных элементов.

...