Когда я устанавливаю привязку всплывающей подсказки в пользовательском элементе WPF, этот способ отлично работает:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
...
SetBinding(ToolTipProperty, new Binding
{
Source = this,
Path = new PropertyPath("Property1"),
StringFormat = "ValueOfProp1: {0}"
});
}
Но когда я пытаюсь использовать MultiBinding, чтобы иметь несколько свойств в ToolTip, это не работает:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
...
MultiBinding multiBinding = new MultiBinding();
multiBinding.StringFormat = "ValueOfProp1: {0}\nValueOfProp2: {1}\nValueOfProp3: {2}\n";
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property1")
});
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property2")
});
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property3")
});
this.SetBinding(ToolTipProperty, multiBinding);
}
В этом случае у меня нет всплывающей подсказки.
Где я ошибаюсь?
Оказывается, что StringFormat
on MultiBinding
работает только с свойствами типа string
, а свойство ToolTip
имеет тип object
. В этом случае MultiBinding
требуется преобразователь значений.
В качестве обходного пути вы можете установить TextBlock
как ToolTip
и связать его свойство Text
с помощью MultiBinding
(так как Text
имеет тип string
, он будет работать с StringFormat
):
TextBlock toolTipText = new TextBlock();
MultiBinding multiBinding = new MultiBinding();
multiBinding.StringFormat = "ValueOfProp1: {0}\nValueOfProp2: {1}\nValueOfProp3: {2}\n";
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property1")
});
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property2")
});
multiBinding.Bindings.Add(new Binding
{
Source = this,
Path = new PropertyPath("Property3")
});
toolTipText.SetBinding(TextBlock.TextProperty, multiBinding);
ToolTip = toolTipText;