Tag
- это конструкция, сохраняемая со дней Winforms (и, возможно, там до этого!).Он использовался как удобное место для связывания объекта с элементом пользовательского интерфейса, таким как FileInfo с Button, поэтому в обработчике событий Button вы могли просто взять отправителя события, привести его к Button, а затем привести Tag
значение для FileInfo, и у вас есть все, что вам нужно для файла, который вы хотите открыть.
Существует одна ситуация , но я обнаружил, что Tag
полезен в WPF,Я использовал его в качестве места ожидания, к которому может получить доступ элемент MenuMenu ContextMenu, который не может использовать обычные привязки RelativeSource, которые вы использовали бы для обхода визуального дерева.
<ListBox.ItemContainerStyle>
<Style
TargetType="ListBoxItem">
<Setter
Property="Tag"
Value="{Binding ElementName=TheUserControlRootElement}" />
<Setter
Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem
Header="_Remove"
ToolTip="Remove this from this list"
CommandParameter="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Command="{Binding PlacementTarget.Tag.Remove, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
Из ContextMenu
, Я не могу получить доступ к команде Remove , которая определена в классе UserControl
, где определен этот фрагмент.Но я могу связать корень с Tag
из ListBoxItem
, к которому я могу получить доступ через свойство ContextMenu.PlacementTarget
.Тот же трюк может использоваться при связывании в пределах ToolTip
, поскольку применяются те же ограничения.