Свойство WPF DependencyPropertyChangedCallback не вызывается - PullRequest
0 голосов
/ 17 октября 2018

Моя проблема в том, что мой OnMatrixPropertyChanged метод никогда не вызывается.Метка, которая связана с тем же свойством, обновляется, поэтому я знаю, что привязка происходит со свойством Matrix.

У меня есть UserControl, к которому я хочу добавить DependencyProperty, чтобы онможет быть связано с.Мое главное окно выглядит следующим образом:

<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 голосов
/ 17 октября 2018

В XAML вашего UserControl определенно есть что-то вроде

<UserControl.DataContext>
    <local:MatrixViewModel/>
</UserControl.DataContext>

.Удалите это, потому что это предотвращает, что Привязка как

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

ищет свойство Matrix в правильном экземпляре модели представления, то есть тот, который унаследован от MainWindow.

UserControls с bindable (т.е.свойства зависимости) никогда не должны устанавливать свой собственный DataContext, потому что это нарушает привязки этих свойств на основе DataContext.

...