我的问题是我的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;
}
}
}
答案 0 :(得分:1)
肯定有类似的东西
<UserControl.DataContext>
<local:MatrixViewModel/>
</UserControl.DataContext>
您的UserControl的XAML中的。删除它,因为它可以防止像
<controls:MatrixView Matrix="{Binding Matrix}" />
在正确的视图模型实例中查找Matrix属性,即从MainWindow继承的实例。
具有可绑定(即依赖项)属性的UserControl绝不要设置自己的DataContext,因为这样做会破坏这些属性的任何基于DataContext的绑定。