c# - 绑定(bind)特定附加属性的值

标签 c# wpf xaml attached-properties

我们的应用程序设计为在以下 3 种模式中的任何一种下运行。

public enum Mode
{
    Express,
    Premium,
    Enterprise
}

有一个附加属性:为每个 Mode 定义的 IsEnabled。这样我们就可以在 XAML 中设置特定控件是否在该模式下启用。 默认情况下,该控件对所有模式启用,除非使用该模式的附加属性将其显式设置为 false。

<Button x:Name="Button1"
        mode:Enterprise.IsEnabled="False"
        IsEnabled="{Binding SelectedMode}"/>

<Button x:Name="Button2"
        mode:Enterprise.IsEnabled="False"
        mode:Premium.IsEnabled="False"
        IsEnabled="{Binding SelectedMode}"/>

SelectedMode 属性的值是上述enum 值中的任意一个。现在的问题是如何为该特定模式设置控件 (Button) 的 IsEnabled 属性。

它的一种工作方式是使用 MultiBinding ,如下所示,但我发现它很笨拙。所以想知道是否有更优雅的解决方案来解决这个问题。

<Button x:Name="Button2"
        mode:Enterprise.IsEnabled="False"
        mode:Premium.IsEnabled="False">
        <Button.IsEnabled>
           <MultiBinding Converter="{StaticResource ModeToBooleanConverter}">
              <Binding Path="SelectedMode"/>
              <Binding Path="mode:Enterprise.IsEnabled" RelativeSource="{RelativeSource Self}"/>
              <Binding Path="mode:Premium.IsEnabled" RelativeSource="{RelativeSource Self}"/>
           </MultiBinding>
        </Button.IsEnabled>
</Button>

编辑:

我希望有一个解决方案,可以减少代码困惑,如下所示,并且 ModeToBooleanConverter 负责处理所有事情。

<Button x:Name="Button2"
            mode:Enterprise.IsEnabled="False"
            mode:Premium.IsEnabled="False"
            IsEnabled="{Binding SelectedMode, Converter=ModeToBooleanConverter}"/>

谢谢。

最佳答案

我会完全删除附加属性,并将您允许的模式作为参数传递给转换器。

首先,如果您将模式定义为标志,那么您可以轻松地将模式组合传递给转换器:

[Flags]
public enum AppMode
{
    Express = 1,
    Premium = 2,
    Enterprise = 4,
    PremiumEnterprise = Premium | Enterprise
}

传递允许的模式如下所示:

<Button Content="Premium Only"
        IsEnabled="{Binding SelectedMode, Converter={StaticResource modeConverter},
        ConverterParameter={x:Static local:AppMode.Premium}}" />
<Button Content="Enterprise Only"
        IsEnabled="{Binding SelectedMode, Converter={StaticResource modeConverter},
        ConverterParameter={x:Static local:AppMode.Enterprise}}" />
<Button Content="Premium or Enterprise"
        IsEnabled="{Binding SelectedMode, Converter={StaticResource modeConverter},
        ConverterParameter={x:Static local:AppMode.PremiumEnterprise}}" />

转换器可能看起来像这样:

[ValueConversion(typeof(AppMode), typeof(bool))]
public class AppModeEnabledConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var selectedMode = (AppMode)value;
        var enabledModes = (AppMode)parameter;
        return 0 != (selectedMode & enabledModes);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

关于c# - 绑定(bind)特定附加属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295602/

相关文章:

c# - 在 C# 和 DateTime 中嵌入 IronRuby

c# - 中心内容 XAML

c# - 使用 XmlTextWriter 序列化然后使用 XmlTextReader 读取的 XML 文件有时会损坏

c# - Azure 的单元测试代码

wpf - 具有DataTemplate的Window.Content

c# - 如何查看 user.config 文件并在更改时重新加载设置?

wpf - 使用 XAML 中的样式将 MenuItem 的 Icon 属性值设置为 Shapes.Path

c# - 如何在Windows Phone 8应用程序的应用程序栏中隐藏/显示图标按钮?

c# - 日期时间.TryParse -> "Ghost ticks"

c# - WPF 图像查看器示例应用程序