c# - 在通用 Windows 应用程序中,如果 View 模型中的属性发生更改,如何使用 xaml 和数据绑定(bind)更改按钮的背景颜色

标签 c# xaml uwp windows-10-universal

通用 Windows 应用程序不支持数据触发器。

如果没有数据触发器,如何仅在 View 模型中的 bool 属性更改时使用 xaml 和数据绑定(bind)更改按钮的背景颜色?

例如给定此 XAML:

<StackPanel>
    <Button Name="ButtonA" Click="ButtonA_Click" Content="A" />
    <Button Name="ButtonB" Click="ButtonB_Click" Content="B" />
    <Button Name="ButtonC" Click="ButtonC_Click" Content="C" />
</StackPanel>

后面有这段代码

private void ButtonA_Click(object sender, RoutedEventArgs e)
{
    Model.IsOnA = !Model.IsOnA;
}

private void ButtonB_Click(object sender, RoutedEventArgs e)
{
    Model.IsOnB = !Model.IsOnB;
}

private void ButtonC_Click(object sender, RoutedEventArgs e)
{
    Model.IsOnC = !Model.IsOnC;
}

当 View 模型中的相应属性更改时,使用数据绑定(bind)更改按钮背景颜色的最佳方法是什么?

我仅使用 VisualStateManager 管理器就可以让它为一个按钮工作:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup>
        <VisualState>
            <VisualState.StateTriggers>
                <StateTrigger IsActive="{x:Bind Model.IsOnA, Mode=OneWay}" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="ButtonA.Background" Value="Red"></Setter>
                <Setter Target="ButtonA.Foreground" Value="White"></Setter>
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

但是对于绑定(bind)到 View 模型中不同属性的多个按钮,这种方法不起作用。

最佳答案

您可以在以下链接中查看我之前的回答。 Delete button on ListView items

您只需创建一个将 Boolean 转换为 SolidColorBrush 的转换器。例如:

public class BooleanToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool)value) ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Green);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new Exception("Not Implemented");
    }
}

并将其添加到您的 Xaml 绑定(bind)。

<Page.Resources>
    <local:BooleanToColorConverter x:Key="ColorConverter"/>
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{x:Bind Activities}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:Activity">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="3*"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock x:Name="txt" Text="{x:Bind Name}" Grid.Column="0"/>
                    <Button x:Name="delItem" Click="delItem_Click" Grid.Column="1" Foreground="{x:Bind Visible, Mode=OneWay, Converter={StaticResource ColorConverter}}" Background="Transparent" Margin="100, 0, 0, 0">
                        <SymbolIcon Symbol="Delete"/>
                    </Button>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

关于c# - 在通用 Windows 应用程序中,如果 View 模型中的属性发生更改,如何使用 xaml 和数据绑定(bind)更改按钮的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34251318/

相关文章:

c# - ASP.NET Web API 不返回 XML

c# - 使用 WrapPanel 指定每行的项目数

c# - 如何动态禁用和启用按钮?

c# - 有关 WPF 及其 XAML 的一般信息

c# - 在 UWP 中禁用控制焦点

serial-port - UWP SerialDevice.FromIdAsync 返回 null

c# - 在 .NET 中以编程方式填充 Word 文档 (OpenXML) 中的内容控件

c# - 枚举MSMQ中的所有传出队列,C#

c# - 在 EntityFramework 和 NHibernate 之间切换

c# - 如何使用 LaunchUriForResultAsync 在全屏模式下启动另一个应用程序?