UWP:如何在不失去绑定的情况下以编程方式设置绑定结构 属性 的值?
UWP: How to programmatically set value of bound struct property without loosing binding?
我有一个 ContentDialog
带有几个控件,其中一个是颜色选择器,用户可以在其中选择颜色。
当对话框加载时,我想用给定的颜色(来自之前的选择)初始化颜色选择器,还有一个显示所选颜色的矩形控件。
颜色选择器绑定到视图模型 (TwoWay) 中的 属性,并且矩形背景颜色也绑定 (OneWay) 到相同的 属性。
<Viewbox Margin="5" MaxWidth="100" Stretch="Fill">
<ColorPicker x:Name="fontColorPicker"
ColorSpectrumShape="Ring"
IsColorPreviewVisible="False"
IsColorChannelTextInputVisible="False"
IsHexInputVisible="False" Color="{x:Bind ViewModel.SelectedColor, Mode=TwoWay}" ColorChanged="fontColorPicker_ColorChanged" />
</Viewbox>
<Rectangle Height="50" Width="50" Margin="10,0,0,0" StrokeThickness="1" Stroke="DarkGray">
<Rectangle.Fill>
<SolidColorBrush Color="{x:Bind ViewModel.SelectedColor, Mode=OneWay}"/>
</Rectangle.Fill>
</Rectangle>
一切都很好,直到我想为颜色选择器设置初始颜色。由于 Color 是一个结构,我无法更改 A、R、G、B 属性,我必须实例化一个新结构并将其分配给 属性。但是通过此分配,绑定将被删除。
这就是我目前在视图模型中更改值以初始化值的方式(settings.Color 不是 Windows.UI.Color,而是来自另一个图像库的 class,所以我必须转换值):
// Font color
if (settings.Color != null)
{
var pickerColor = new Windows.UI.Color
{
A = settings.Color.A,
R = settings.Color.R,
G = settings.Color.G,
B = settings.Color.B
};
ViewModel.SelectedColor = pickerColor;
}
我知道,我可以在此之后重新创建绑定,使其再次工作,但我确信必须有一种更干净的方法,而不需要发生这种情况。
您可以让 ViewModel class 实现 INotifyPropertyChanged
接口:
public class ViewModel : INotifyPropertyChanged
{
private Color _selectedColor;
public Color SelectedColor
{
get => _selectedColor;
set
{
_selectedColor = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这样,当您通过OneWay绑定SelectedColor
时,对SelectedColor
的更改会通知UI也更改。
我有一个 ContentDialog
带有几个控件,其中一个是颜色选择器,用户可以在其中选择颜色。
当对话框加载时,我想用给定的颜色(来自之前的选择)初始化颜色选择器,还有一个显示所选颜色的矩形控件。
颜色选择器绑定到视图模型 (TwoWay) 中的 属性,并且矩形背景颜色也绑定 (OneWay) 到相同的 属性。
<Viewbox Margin="5" MaxWidth="100" Stretch="Fill">
<ColorPicker x:Name="fontColorPicker"
ColorSpectrumShape="Ring"
IsColorPreviewVisible="False"
IsColorChannelTextInputVisible="False"
IsHexInputVisible="False" Color="{x:Bind ViewModel.SelectedColor, Mode=TwoWay}" ColorChanged="fontColorPicker_ColorChanged" />
</Viewbox>
<Rectangle Height="50" Width="50" Margin="10,0,0,0" StrokeThickness="1" Stroke="DarkGray">
<Rectangle.Fill>
<SolidColorBrush Color="{x:Bind ViewModel.SelectedColor, Mode=OneWay}"/>
</Rectangle.Fill>
</Rectangle>
一切都很好,直到我想为颜色选择器设置初始颜色。由于 Color 是一个结构,我无法更改 A、R、G、B 属性,我必须实例化一个新结构并将其分配给 属性。但是通过此分配,绑定将被删除。
这就是我目前在视图模型中更改值以初始化值的方式(settings.Color 不是 Windows.UI.Color,而是来自另一个图像库的 class,所以我必须转换值):
// Font color
if (settings.Color != null)
{
var pickerColor = new Windows.UI.Color
{
A = settings.Color.A,
R = settings.Color.R,
G = settings.Color.G,
B = settings.Color.B
};
ViewModel.SelectedColor = pickerColor;
}
我知道,我可以在此之后重新创建绑定,使其再次工作,但我确信必须有一种更干净的方法,而不需要发生这种情况。
您可以让 ViewModel class 实现 INotifyPropertyChanged
接口:
public class ViewModel : INotifyPropertyChanged
{
private Color _selectedColor;
public Color SelectedColor
{
get => _selectedColor;
set
{
_selectedColor = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这样,当您通过OneWay绑定SelectedColor
时,对SelectedColor
的更改会通知UI也更改。