Я хочу использовать всплывающие подсказки, как они были предназначены. Но когда возникает ошибка, я хочу изменить их, чтобы показать сообщение об ошибке, а затем, когда ошибка исправлена, измените их.WPF создать прикрепленное свойство для всплывающих подсказок
Таким образом, я создал прикрепленное свойство для хранения всплывающей подсказки. Я назначаю всплывающую подсказку прикрепленному свойству, а затем использую стиль для копирования его в свойство всплывающей подсказки. Если есть ошибка, стиль вместо этого устанавливает подсказку в сообщение об ошибке.
Так триггеры, чтобы установить сообщение об ошибке в подсказке являются:
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="BorderBrush"
Value="{DynamicResource controls-errorBorderBrush}" />
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
Это кажется довольно легко (и работает)
Когда фиксируется ошибка, я поставил его обратно (это Безразлично» т работы):
<Trigger Property="Validation.HasError"
Value="false">
<Setter Property="ToolTip"
Value="{Binding Path=(wpfMisc:myCtrl.tooltipValue)}" />
</Trigger>
И в файле XAML у меня есть:
<TextBox Text="this is a textbox with a myMisc based tooltip"
Name="txtTooltip2"
wpfMisc:myCtrl.tooltipValue="Tooltip Test tooltip" />
Итак, проблема, скорее всего, связана с моим прикрепленным свойством, так как кажется, что информация не сохраняется правильно. Вот этот код:
public static string GettooltipValue(DependencyObject obj)
{
string value = obj.GetValue(tooltipValueProperty).ToString() ;
value = value.trimNull() ; // extension method to insure at least an empty string
return value ;
}
public static void SettooltipValue(DependencyObject obj, string value)
{
obj.SetValue(tooltipValueProperty, value.trimNull());
}
public static readonly DependencyProperty tooltipValueProperty =
DependencyProperty.RegisterAttached("tooltipValue",
typeof(string),
typeof(myCtrl),
new UIPropertyMetadata(string.Empty));
Так что я думаю, что мне нужно использовать что-то другое в UIPropertyMetaData, но не уверен, что я хотел бы использовать. Или мой подход просто ошибается?
Я хочу иметь подсказки для конкретных данных для всех полей данных.
У меня была эта работа, перемещая всплывающую подсказку в свойство тега во время ошибки, но я не хотел, чтобы он работал так, потому что я знаю, что у меня возникнут проблемы, когда какой-либо другой код захочет использовать тегом каким-то особым образом.
Кроме того, я знаю, что некоторые из кода многословен - просто побочный эффект отладки ...
И еще одно свойство зависимостей в myCtrl работает просто отлично, так что я знаю Xmlns и т.д. ссылки верный.
В дальнейших исследованиях я нашел следующее в окне вывода: Ошибка System.Windows.Data: 17: Невозможно получить значение «tooltipValue» (введите «String») из «'(введите« layoutSettingsViewModel »). BindingExpression: Путь = (0); DataItem = 'layoutSettingsViewModel' (HashCode = 46457861); целевым элементом является «TextBox» (Name = ''); target property - это «ToolTip» (тип «Object») InvalidCastException: «System.InvalidCastException: не удается лить объект типа« client.Models.layoutSettings.layoutSettingsViewModel »для ввода« System.Windows.DependencyObject ».
layoutSettingsViewModel - это представление xaml. Поэтому я считаю, что само представление каким-то образом получает значение вместо элементов управления ... Не уверен, хотя - я предполагаю, что один из вас точно знает, что это значит и почему ... Я ненавижу пытаться встать на скорость на новый язык ...
В любом случае, любая помощь и/или предложения приветствуются.
вы получаете какие-либо обязательные ошибки в окне вывода, когда проверка .HasError установлен в false? и как и где вы устанавливаете wpfMisc: myCtrl.tooltipValue? Также можете ли вы поделиться элементом управления, на котором вы применяете эти триггеры? – Nitin
2 вещи, которые я бы начал с: сначала попробуйте вернуть только obj.GetValue не нужно для всего остального кода, так как wpf (C#) может оптимизировать ваш вложенный код свойства, и обычно это будет реализация по умолчанию, которая, вероятно, не так (0), Во-вторых, добавьте обратный вызов для своего dp и посмотрите, действительно ли значение изменяет, когда и к чему вы, дайте мне знать, что вы придумали. –
nit, у меня был код, но по какой-то причине он не показывался. Сейчас. И я тестировал с помощью простого текстового поля, хотя я хочу использовать его с любым элементом управления вводом данных. – JustMeToo