代码之家  ›  专栏  ›  技术社区  ›  J-man

将值从视图模型发送到UserControl依存关系属性WPF

  •  0
  • J-man  · 技术社区  · 7 年前

    我在一个 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 因为如果没有它,我的 用户控制 将不再工作。

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   mm8    7 年前

    DataContext = this 设置 DataContext UserControl 对自己。你不想这样做。相反,您可以绑定到 用户控制 使用 {RelativeSource} 不设置 数据上下文 属性:

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