首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF下划线绑定(MVVM)

WPF下划线绑定(MVVM)
EN

Stack Overflow用户
提问于 2019-11-11 14:12:36
回答 3查看 669关注 0票数 0

有没有一种划线的方法??我正在努力实现以下目标:

我有一个具有bool属性的VievModel

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

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

代码语言:javascript
复制
public void Home() {
//CurrentPage = ApplicationPage.Home;
//HomeButtonForeground = new SolidColorBrush(Colors.White);
HomeButtonUnderline = true;
SettingsButtonUnderline = false;
}

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

代码语言:javascript
复制
<Button>
<TextBlock Command="{Binding HomeNavCommand}" Underline="{Binding HomeButtonUnderline}"/> 
</Button>

问题是没有“下划线”属性,而是由“TextDecorations”处理:

代码语言:javascript
复制
<Button>
<TextBlock TextDecorations="Underline">
</Button>

那么,是否有一种方法来控制下划线使用MVVM,甚至没有它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-11 14:26:01

使用转换器将模型类型(在本例中为bool)转换为UI类型(在本例中为TextDecoration)。

代码语言:javascript
复制
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, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

然后在绑定中使用它(在您的窗口中创建资源之后,UserControl App.xaml或任何您认为合适的地方;对于这个示例,我只是把它放在按钮资源中)

代码语言:javascript
复制
<Button Command="{Binding HomeNavCommand}">
    <Button.Resources>
        <local:UnderlineConverter x:Key="UnderlineConverter" />
    </Button.Resources>
    <TextBlock TextDecorations="{Binding HomeButtonUnderline, Converter={StaticResource UnderlineConverter}"/> 
</Button>
票数 2
EN

Stack Overflow用户

发布于 2019-11-11 14:32:44

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

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2019-11-12 11:02:25

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

代码语言:javascript
复制
public TextDecorationCollection HomeButtonUnderline { get; set; }

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58803032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档