未调用WPF DependencyProperty PropertyChangedCallback

时间:2018-10-17 12:26:17

标签: c# wpf xaml data-binding dependency-properties

我的问题是我的OnMatrixPropertyChanged方法从未被调用。绑定到同一属性的标签会更新,因此我知道Matrix属性正在发生绑定。

我有一个UserControl,我想添加一个DependencyProperty以便可以绑定到它。我的MainWindow看起来像这样:

<Window.DataContext>
    <local:MainWindowViewModel />
</Window.DataContext>

<StackPanel>
    <Button
        Command="{Binding LoadMatrixCommand}"
        Content="Load"
        Width="150">
    </Button>

    <Label
        Content="{Binding Matrix.Title}">
    </Label>

    <controls:MatrixView
        Matrix="{Binding Path=Matrix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    </controls:MatrixView>
</StackPanel>

在我的MatrixView UserControl后面的代码中,我将DependencyProperty设置为:

public partial class MatrixView : UserControl
{
    public static readonly DependencyProperty MatrixProperty =
        DependencyProperty.Register(nameof(Matrix), typeof(Matrix), typeof(MatrixView), new PropertyMetadata(default(Matrix), OnMatrixPropertyChanged));

    private static void OnMatrixPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Do Something
    }

    public Matrix Matrix
    {
        get => (Matrix)GetValue(MatrixProperty);
        set => SetValue(MatrixProperty, value);
    }

    public MatrixView()
    {
        InitializeComponent();
    }
}

我一定很想念一些东西...

编辑#1:查看模型

public class MatrixViewModel : ViewModelBase
{
    public MatrixViewModel()
    {
    }
}

public class MainWindowViewModel : ViewModelBase
{
    private IMatrixService _matrixService;
    private Matrix _matrix;

    public Matrix Matrix
    {
        get => _matrix;
        set
        {
            _matrix = value;
            base.RaisePropertyChanged();
        }
    }

    public ICommand LoadMatrixCommand { get; private set; }

    public MainWindowViewModel()
    {
        LoadMatrixCommand = new RelayCommand(LoadMatrix);
        _matrixService = new MatrixService();
    }

    private void LoadMatrix()
    {
        var matrixResult = _matrixService.Get(1);

        if (matrixResult.Ok)
        {
            Matrix = matrixResult.Value;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

肯定有类似的东西

<UserControl.DataContext>
    <local:MatrixViewModel/>
</UserControl.DataContext>
您的UserControl的XAML中的

。删除它,因为它可以防止像

<controls:MatrixView Matrix="{Binding Matrix}" />

在正确的视图模型实例中查找Matrix属性,即从MainWindow继承的实例。

具有可绑定(即依赖项)属性的UserControl绝不要设置自己的DataContext,因为这样做会破坏这些属性的任何基于DataContext的绑定。