将值从视图模型发送到 UserControl 依赖项 属性 WPF

Send Value from View Model to UserControl Dependency Property WPF

我在 UserControl 中有一个依赖关系 属性 和一个名为 SelectedColor 的 属性。在我的主应用程序中,使用我的代码的 window 的视图是:

<controls:ColorPicker SelectedColor="{Binding MyCanvas.CanvasBackgroundColor}" />

来自视图模型的代码是:

public MyCanvas { get; set; }

public MyWindowViewModel(MyCanvas myCanvas)
{
    MyCanvas = myCanvas;
}

然后我的 UserControl 的 XAML 是:

<UserControl . . .>
    <Button Click="Button_Click">
        <Button.Style>
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border Background="{Binding SelectedColor}" BorderBrush="Black" BorderThickness="1" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>
</UserControl>

以及隐藏代码:

public ColorPicker()
{
    InitializeComponent();
    DataContext = this;
}

public SolidColorBrush SelectedColor
{
    get { return (SolidColorBrush)GetValue(SelectedColorProperty); }
    set { SetValue(SelectedColorProperty, value); }
}

public static readonly DependencyProperty SelectedColorProperty =
    DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null));

我认为问题可能与代码隐藏 DataContext = this; 中的行有关。声明这会在主应用程序中为此用户控件的实例创建一个全新的上下文是否正确,因此从视图模型发送给它的任何值都将被重新初始化?如果是这样,我如何在不重新声明的情况下发送该值?我还需要 DataContext = this 行,因为如果没有它,我的 UserControl 中的某些功能将不再起作用。

有人遇到过这个吗?

提前致谢!

DataContext = thisUserControlDataContext 设置为其自身。你不想这样做。相反,您可以使用 {RelativeSource} 绑定到 UserControl 的 属性 而无需设置 DataContext 属性:

<Border Background="{Binding SelectedColor, RelativeSource={RelativeSource AncestorType=UserControl}}"
        BorderBrush="Black" BorderThickness="1" />

代码隐藏:

public ColorPicker()
{
    InitializeComponent();
}

public SolidColorBrush SelectedColor
{
    get { return (SolidColorBrush)GetValue(SelectedColorProperty); }
    set { SetValue(SelectedColorProperty, value); }
}

public static readonly DependencyProperty SelectedColorProperty =
    DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null));