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也更改。