从View Model发送值到UserControl依赖属性WPF

时间:2017-10-17 15:16:38

标签: wpf mvvm user-controls dependency-properties

我在UserControl中有一个依赖项属性,其属性名为SelectedColor。在我的主应用程序中,使用此代码的窗口视图是:

<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中的某些功能将无法使用。

有没有人遇到过这个?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

DataContext

<强>代码隐藏:

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