通过触发器动态更新 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
设置为 OneWay
:Style="{x:Bind InfoBadgeStyle, Mode=OneWay}"
问题是 属性 只绑定了一次。将 Mode
设置为 OneWay
解决了这个问题。感谢 mm8 的提示。
<muxc:InfoBadge Style="{x:Bind InfoBadgeStyle, Mode=OneWay}"/>
我想根据使用的 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
设置为 OneWay
:Style="{x:Bind InfoBadgeStyle, Mode=OneWay}"
问题是 属性 只绑定了一次。将 Mode
设置为 OneWay
解决了这个问题。感谢 mm8 的提示。
<muxc:InfoBadge Style="{x:Bind InfoBadgeStyle, Mode=OneWay}"/>