2012-04-21 176 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"); 
} 

當然,他們可能更多地設置在你的最後。但是,這將是我會採取的路線。

相關問題