2012-04-21 175 views
1

我正在Silverlight Web应用程序(RIA)上工作,该Silverlight Web应用程序托管在Silverlight Web应用程序中。silverlight中的stackpanel可见性编辑

背景:我在XAML页面的一个一个StackPanel。我试图简化我的问题。这是分列如下:

我的XAML页面有一个堆栈面板和StackPanel中只有文本块和按钮它。导航到xaml页面时,只有授权用户才能看到文本块中的值。如果用户未经授权,我打算在文本块中显示“未经授权”的消息(而不是价值)(按钮也是折叠的,我不显示按钮。)

仅供参考,texblock的这个值来自WCF服务我已经为服务中的授权制定了适当的属性。如果未经授权,价值将不会来自服务的文本块。我现在所做的只是针对用户界面,当某些用户尝试从浏览器的地址栏输入网页的网址时,我想向他展示未经授权的消息。

我有什么迄今所做::我给一个名字的StackPanel。我给了文本块名称和按钮名称。如果授权,我将文本块的文本值设置为服务返回值。

如果未经授权,我改变从cs文件,因为这样有知名度和文字。

textblock.Text="unauthorized"; 
buttonname.Visibility = Visibility.Collapsed; 

问题:问题是我有一个想法。 :(当我有一个名字为我的StackPanel,我可以说 stackpanelname.Visibility = Visibility.Collapsed。

但我不能证明我的消息(文字块)现在,怎么把孩子控制也崩溃与父母有什么方式是,我可以折叠我的堆叠面板(父级控制),但只有其中一个控件(一个子控件,或少数几个)是可见的。

解决方案:当我打字时,我得到了一个解决方案,我可以去对于一个新的堆栈面板,具有文本块,它的知名度,我可以设置为可见,并作为我的消息,但是,是它唯一的出路。?我们如何处理这些情况?

在一般情况下,假设我的问题清楚了从UI中,什么是在这种情况下提供安全性的一般方法。它会重定向到错误页面/登录页面还是在同一页面或其他任何东西上发送给用户的消息。假设后端服务将拥有授权的属性和逻辑。

回答

1

通常我会用绑定来解决这个问题。我不确定你是否愿意采取这种方法,但是考虑到你是这样做的。例如,我会这样做:

<TextBlock Text="{Binding AuthorizationCaption,FallbackValue='Unauthorized'" /> 

此处的回退值用于查看设计目的的外观。 FallbackValues仅在绑定失败时才呈现。

对于按钮,我这样做:

<Button Content="My Button" Visibility="{Binding IsAuthorized,Converter={StaticResource VisibilityValueConverter},FallbackValue=Collapsed}" /> 

在上面的例子中,你会发现,我用什么我叫VisibilityValueConverter。这当然会成为我在XAML中定义“LayoutRoot”的资源的一部分。例如

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyUICustomizationLib;component/rdMyResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

我VisibilityValueConverter是一个简单的转换到一个布尔值转换为可见性属性。它非常可重用。它实现了IValueConverter,我认为它是在System.Windows.Data。大意:

public class TVisibilityValueConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool _visibility = (bool)value; 
     return _visibility ? Visibility.Visible : Visibility.Collapsed; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Visibility _visibility = (Visibility)value; 
     return _visibility == Visibility.Visible; 
    } 
} 

我会嵌入我的价值转换器在我的ResourceDictionary的,首先,定义一个命名空间,以它的位置 -

xmlns:muicl="clr-namespace:MyUICustomizationLib.ValueConverters" 

然后定义静态资源:

<muicl:TVisibilityValueConverter x:Key="VisibilityValueConverter" /> 

最后但并非最不重要的是,实现我的viewmodel属性和命令以适应所要做的事情。即,我做了必要的服务器调用,并且在回调中,我相应地切换了AuthorizationCaption属性和IsAuthorized属性。最简单的方法是让AuthorizationCaption成为依赖于IsAuthorized属性的简单if语句。让IsAuthorizedProperty的set方法引发AuthorizationCaption也发生变化的事件通知。例如

set 
{ 
    __fIsAuthorized = value;//set private member 
    this.RaisePropertyChanged("IsAuthorized"); 
    this.RaisePropertyChanged("AuthorizationCaption"); 
} 

当然,他们可能更多地设置在你的最后。但是,这将是我会采取的路线。

相关问题