Привязка видимости всплывающей подсказки Silverlight 4 - PullRequest
1 голос
/ 09 декабря 2011

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

У меня есть форма с кнопкой отправки, которая отключается, если необходимые поля не были введены. Когда кнопка отключена, я хочу всплывающую подсказку с соответствующим сообщением. Когда он включен, подсказка не нужна. Для этого я помещаю кнопку в прозрачную рамку и устанавливаю всплывающую подсказку на границе, так как подсказка на самой кнопке никогда не будет отображаться, когда она отключена. Однако привязка видимости к всплывающей подсказке не выполняется, и кажется, что я могу изменить только видимость в коде позади. Я могу использовать точно такую ​​же привязку к видимости для различных элементов управления (в приведенном ниже примере я использую его и для TextBlock). Если я применяю точно такую ​​же привязку в коде позади, он работает нормально. Почему это не работает в XAML?

XAML

<UserControl.Resources>
    <local:VisibilityConverter x:Key="visibilityConverter"/>
    <local:VisibilityConverter x:Key="reversedVisibilityConverter" IsReversed="True"/>
</UserControl.Resources>

<StackPanel Background="White"
            Width="310">
    <TextBlock Text="Using XAML binding for tooltip visibility..."
               FontWeight="Bold"/>
    <CheckBox x:Name="cbEnable"
              Content="Enable Submit Button"/>
    <Border Background="Transparent"
            Margin="0,10,0,0">
        <ToolTipService.ToolTip>
            <!-- This has the same binding as the 2nd TextBlock below, it should be visible when cbEnable is NOT checked and collapsed when it is checked -->
            <ToolTip Content="Submit Button Is Disabled"
                     Visibility="{Binding IsChecked, ElementName=cbEnable, Converter={StaticResource reversedVisibilityConverter}}"/>
        </ToolTipService.ToolTip>

        <Button Content="Submit"
                IsEnabled="{Binding IsChecked, ElementName=cbEnable}"/>
    </Border>

    <!-- This TextBlock is visibile when cbEnable is checked -->
    <TextBlock Text="Submit Button is enabled"
               Visibility="{Binding IsChecked, ElementName=cbEnable, Converter={StaticResource visibilityConverter}}"/>
    <!-- This TextBlock is visibile when cbEnable is NOT checked (same as ToolTip binding above -->
    <TextBlock Text="Submit Button is disabled"
               Visibility="{Binding IsChecked, ElementName=cbEnable, Converter={StaticResource reversedVisibilityConverter}}"/>

    <TextBlock Text="Using code-behind binding for tooltip visibility..."
               FontWeight="Bold"
               Margin="0,20,0,0"/>
    <CheckBox x:Name="cbEnable2"
              Content="Enable Submit Button"/>

    <Border Background="Transparent"
            Margin="0,10,0,0">
        <ToolTipService.ToolTip>
            <ToolTip x:Name="toolTip2"
                     Content="Submit Button 2 Is Disabled"/>
        </ToolTipService.ToolTip>

        <Button Content="Submit 2"
                IsEnabled="{Binding IsChecked, ElementName=cbEnable2}"/>
    </Border>

    <TextBlock Text="Submit Button 2 is enabled"
               Visibility="{Binding IsChecked, ElementName=cbEnable2, Converter={StaticResource visibilityConverter}}"/>
    <TextBlock Text="Submit Button 2 is disabled"
               Visibility="{Binding IsChecked, ElementName=cbEnable2, Converter={StaticResource reversedVisibilityConverter}}"/>
</StackPanel>

Код-за:

public partial class MainPage : UserControl {
    public MainPage() {
        InitializeComponent();

        toolTip2.SetBinding(ToolTip.VisibilityProperty, new System.Windows.Data.Binding("IsChecked") {
            Source = cbEnable2,
            Converter = new VisibilityConverter() { IsReversed = true }
        });
    }
}

VisibilityConverter:

public class VisibilityConverter : IValueConverter {
    public bool IsReversed { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        bool isVisible = System.Convert.ToBoolean(value, CultureInfo.InvariantCulture);
        if (IsReversed) {
            isVisible = !isVisible;
        }
        return (isVisible ? Visibility.Visible : Visibility.Collapsed);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        bool isVisible = ((Visibility)value == Visibility.Visible);
        if (IsReversed) {
            isVisible = !isVisible;
        }
        return isVisible;
    }
}

1 Ответ

0 голосов
/ 07 июня 2012

Ну, я не знаю, почему это исправило это, но вот что я сделал: я переименовал свойство в моей ViewModel.Да, я знаю.Кажется смешнымЯ изменил свойство с IsWaitingVisible на WaitingVisibility.Я понял эту идею, потому что я изменил свойство ViewModel с bool на текст, а затем связал его с временным видимым TextBlock.Это не будет отображать значение так же, как другое свойство в той же ViewModel.Это было просто сумасшествие, поэтому я переименовал собственность в нечто другое и вуаля!Текст начал появляться в пользовательском интерфейсе.Затем я снова подключил свойство видимости сетки (и изменил свой VisibilityConverter для работы со строками вместо bool), и все заработало.

Я предполагаю, что в научных целях мне следует изменить имя свойства обратно на IsWaitingVisibleи посмотрим, сломается ли это.Если это так, мне придётся сделать вывод, что это серьезная ошибка в SL 5.

Такая глупость просто пугает меня, когда я думаю о создании надежных приложений в Silverlight.

...