通过触发器动态更新 UWP 中的控件样式

Dynamically update style of control in UWP via a trigger

我想根据使用的 class 中的 enum 在模板中显示控件的 style。我尝试使用 this to use the enum in XAML and this to create a trigger。问题是我不能在 UWP 中使用 x:Static 并且触发器永远不会被触发。我的解决方法也不起作用。

我的class:


//Namespace Enums
public enum ConnectionState
{
    Open,
    Closed,
    Connecting,
    Broken
}

//Namespace Models
public class DatabaseConnection : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private ConnectionState _connectionState = ConnectionState.Broken;
    public ConnectionState ConnState
    {
        get => _connectionState;
        set
        {
            if (value != _connectionState)
            {
                _connectionState = value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(ConnStateInt));
                OnPropertyChanged(nameof(InfoBadgeStyle));
            }
        }
    }

    public int ConnStateInt => (int)ConnState;

    public Style InfoBadgeStyle
    {
        get
        {
            return ConnState switch
            {
                ConnectionState.Open => (Style)Application.Current.Resources["SuccessIconInfoBadgeStyle"],
                ConnectionState.Connecting => (Style)Application.Current.Resources["AttentionIconInfoBadgeStyle"],
                ConnectionState.Broken => (Style)Application.Current.Resources["CriticalIconInfoBadgeStyle"],
                _ => (Style)Application.Current.Resources["InformationalIconInfoBadgeStyle"],
            };
        }
    }
}

我的模板:

<Page.Resources>
    <DataTemplate x:Key="ConnectionTemplate" x:DataType="models:DatabaseConnection">
        <muxc:InfoBadge Style="{x:Bind InfoBadgeStyle}"/>
    </DataTemplate>
</Page.Resources>

如何在 UWP 中使用触发器更新样式?

不清楚为什么 InfoBadgeStyle 属性 和 XAML 中的触发器,但是如果您希望 ChangePropertyActions 能够设置 Style 属性,你不应该像这样设置本地 Style 属性,因为它将优先:

<muxc:InfoBadge ... Style="{x:Bind InfoBadgeStyle}">

所以要么移除 InfoBadgeStyle 属性 要么移除触发器。

另请注意,x:Bind 默认绑定 OneTime,因此如果您想对更改通知做出反应,您应该将 Mode 设置为 OneWayStyle="{x:Bind InfoBadgeStyle, Mode=OneWay}"

问题是 属性 只绑定了一次。将 Mode 设置为 OneWay 解决了这个问题。感谢 mm8 的提示。

<muxc:InfoBadge Style="{x:Bind InfoBadgeStyle, Mode=OneWay}"/>