2011-12-09 76 views
1

我想綁定在XAML提示知名度,我遇到一個令人困惑的問題,在我的知名度結合其它控件罰款,但沒有對提示的作品。的Silverlight 4工具提示能見度綁定

我有一個提交按鈕,當沒有輸入所需的字段是禁用的形式。當按鈕被禁用時,我想要一個工具提示和相關消息。當它被啓用時,不需要工具提示。要做到這一點我放在一個透明邊框的按鈕,並設置邊框上的提示,因爲按鈕被禁用時本身絕不會顯示一個提示。但是,綁定到工具提示的可見性失敗,似乎我只能更改代碼隱藏的可見性。我可以對各種控件的可見性使用完全相同的綁定(在下面的示例中,我也在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; 
    } 
} 
+0

進一步測試後,這似乎是不可能綁定在XAML工具提示的可見性,但結合是後臺代碼工作得很好。這是一個錯誤還是一個架構限制?有任何想法嗎? – jscott

+0

很好的問題。我學會了如何從代碼隱藏設置可見性。我的投票+1 – imdadhusen

回答

0

好吧,我不知道知道爲什麼這個固定它,但這裏是我做的:我重命名了我的ViewModel中的屬性。是的,我知道。看起來很可笑。我將該屬性從IsWaitingVisible更改爲WaitingVisibility。我明白了,因爲我將ViewModel屬性從bool更改爲文本,然後將其綁定到臨時的可見TextBlock。它不會像在同一個ViewModel中的不同屬性那樣顯示值。那太瘋狂了,所以我把這個房子改名爲別的,瞧!文字開始出現在用戶界面中。然後,我重新連接了網格的可見性屬性(並將我的VisibilityConverter更改爲使用字符串而不是bool),並且一切正常。

我想對科學而言,我應該改變屬性名稱回IsWaitingVisible,看看它是否打破。如果是這樣,我將不得不得出結論,這是在SL 5

硬錯誤這種片狀的只是讓我害怕的時候我想在Silverlight構建可靠的應用程序。