繁体   English   中英

绑定特定附加属性的值

[英]Binding the value of specific attached property

我们的应用程序旨在在以下三种模式中的任何一种下运行。

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();
    }
}

有趣的问题!

我不知道哪种方法是完成此任务的最佳方法,但是在您的情况下,您可以执行以下操作:

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

现在,在ModeToBooleanConverter中,您可以从Convert方法的值字段(示例中为Button)获取附加属性的值,并返回正确的值。

现在等待更好的响应!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM