【问题标题】:Send Value from View Model to UserControl Dependency Property WPF将值从视图模型发送到 UserControl 依赖属性 WPF
【发布时间】:2017-10-17 15:16:37
【问题描述】:

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

有人遇到过这种情况吗?

提前致谢!

【问题讨论】:

  • this.DataContext = this; 是 WPF MVVM 的毒瘤。 This article explains why。你会注意到它有点长,但化疗也是如此。

标签: wpf mvvm user-controls dependency-properties


【解决方案1】:

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));

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多