1

我正在开发托管在 Silverlight Web 应用程序上的 Silverlight Web 应用程序 (RIA)。

背景:我在其中一个 xaml 页面中有一个堆栈面板。我试图简化我的问题。下降如下:

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

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

到目前为止我做了什么:: 我给 stackpanel 起了个名字。我给文本块起了一个名字,给按钮起了一个名字。如果授权,我将文本块的文本值设置为服务返回值。

如果未经授权,我将更改 .cs 文件中的可见性和文本。

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

问题:问题是我有一个想法。:( 当我为我的堆栈面板命名时,我可以说 stackpanelname.Visibility = Visibility.Collapsed;

但是我现在无法显示我的消息(文本块),因为子控件也与父控件一起折叠。有什么办法可以折叠我的堆栈面板(父控件),但只有一个控件(一个子控件或几个)是可见的。

解决方案:当我输入这个时,我得到了一个解决方案,我可以选择一个新的堆栈面板,带有一个文本块,我可以将其可见性设置为 VISIBLE,并将文本作为我的消息。但是,这是唯一的方法吗?我们如何处理这些情况?

一般来说,假设我的问题很清楚,在这种场景中提供安全性的一般方法是什么,从 UI。是否会重定向到错误页面/登录页面或同一页面上的用户消息或任何其他内容。假设后端服务将具有授权的属性和逻辑。

4

1 回答 1

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>

My VisibilityValueConverter 是一个简单的转换器,用于将布尔值转换为可见性属性。它非常可重复使用。它实现 了我认为在System.Windows.Data中的IValueConverter。顺带一提:

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" />

最后但并非最不重要的一点是,实现我的视图模型属性和命令以适应必须的内容。即,我进行了必要的服务器调用,并且在回调中,我相应地切换了 AuthorizationCaption 属性和 IsAuthorized 属性。最简单的方法是让 AuthorizationCaption 成为一个简单的 if 语句,它依赖于 IsAuthorized 属性。让 IsAuthorizedProperty 的 set 方法引发 AuthorizationCaption 也发生更改的事件通知。例如

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

当然,它们可能更适合您设置。但这将是我将采取的路线。

于 2012-04-22T11:30:40.077 回答