通常我会用绑定来解决这样的问题。我不确定您是否愿意采用这种方法,但鉴于您愿意。例如,我会这样做:
<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");
}
当然,它们可能更适合您设置。但这将是我将采取的路线。