WPF下划线绑定(MVVM)

有没有办法绑定下划线?我正在努力实现以下目标:

我有一个extension NSLayoutDimension { @discardableResult func set( to constant: CGFloat,priority: UILayoutPriority = .required ) -> NSLayoutConstraint { let cons = constraint(equalToConstant: constant) cons.priority = priority cons.isactive = true return cons } } ,具有bool属性:
VievModel

然后,我想在以下函数中控制此属性:

 public bool HomeButtonUnderline { get; set; } = false;

然后我可以在XAML中利用此控件:

public void Home() {
//CurrentPage = ApplicationPage.Home;
//HomeButtonForeground = new SolidColorBrush(Colors.White);
HomeButtonUnderline = true;
SettingsButtonUnderline = false;
}

问题在于没有'Underline'属性,而是由'TextDecorations'处理:

<Button>
<TextBlock Command="{Binding HomeNavCommand}" Underline="{Binding HomeButtonUnderline}"/> 
</Button>

那么有没有办法使用MVVM来控制下划线呢?

o345768478 回答:WPF下划线绑定(MVVM)

您可以在TextBlock的样式中使用DataTrigger:

<Button Command="{Binding HomeNavCommand}">
    <TextBlock Text="Home">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding HomeButtonUnderline}" Value="True">
                        <Setter Property="TextDecorations" Value="Underline"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</Button>
,

使用Converter将模型类型(在这种情况下为bool)转换为UI类型(在这种情况下为TextDecoration)。

public class UnderlineConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
    {
        if (value == null)
            return null;

        return System.Convert.ToBoolean(value) ? TextDecorations.Underline : null;
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

然后在绑定中使用它(在Window,UserControl App.xaml或您认为合适的位置创建资源后;对于本示例,我只是将其放在按钮资源中)

<Button Command="{Binding HomeNavCommand}">
    <Button.Resources>
        <local:UnderlineConverter x:Key="UnderlineConverter" />
    </Button.Resources>
    <TextBlock TextDecorations="{Binding HomeButtonUnderline,Converter={StaticResource UnderlineConverter}"/> 
</Button>
,

当然,解决此问题的另一种方法是使视图模型成为视图的正确类型:

public TextDecorationCollection HomeButtonUnderline { get; set; }

HomeButtonUnderline已经面向GUI,因此,视图模型中可能有一些代码可以从模型中分配一个值,因此它也可能也从bool转换为TextDecorations.Underline

与转换器不同,此方法将所有逻辑保留在同一文件中,尽管转换器更可重用。它还具有易于进行单元测试的优势(与数据触发器不同)。

本文链接:https://www.f2er.com/3123606.html

大家都在问