在(视图的)代码后面的依赖属性绑定到其视图模型的属性时,我做错了什么?

本文关键字:属性 视图 模型 错了 什么 绑定 代码 依赖 | 更新日期: 2023-09-27 18:15:53

其他几个帖子似乎表明,数据可以在视图的后台代码和视图模型之间共享,通过绑定后台代码中的依赖属性和视图模型中的属性。此外,我已经读到,当DP本身被绑定在主窗口/用户控制关系中时,它应该在代码后面。

(SetupUC)

后面的代码如下
 public static readonly DependencyProperty UC1Property =
     DependencyProperty.Register(
     "UC1", typeof(string), typeof(SetupUC),
     new FrameworkPropertyMetadata()
     {
        PropertyChangedCallback = OnUC1Changed,
        BindsTwoWayByDefault = true
     });
    public string UC1
    {
        get { return (string)GetValue(UC1Property); }
        set
        {
            SetValue(UC1Property, value);
        }
    }
public SetupUC()
    {
        InitializeComponent();
        SetupViewModel svm = new SetupViewModel();
        this.DataContext = svm;
        Binding binding = new Binding("ViewModelStringProperty") { Source = svm, Mode = BindingMode.TwoWay };
        BindingOperations.SetBinding(this, SetupUC.UC1Property, binding);
    }

和视图模型(SetupViewModel)

private string _viewModelStringProperty;
    public string ViewModelStringProperty
    {
        get { return _viewModelStringProperty; }
        set
        {
            _viewModelStringProperty = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("ViewModelStringProperty"));
            }
        }
    }
public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

在调试中,UC1似乎总是从主窗口正确更新,因为它的更改反映在用户控件视图中。然而,在视图模型中,ViewModelStringProperty似乎从来没有被更新过——它总是空的。完全披露(!),以下是UC1在用户控件XAML

中的绑定方式
<TextBox x:Name="tbx1" HorizontalAlignment="Left" Height="23" Margin="159,22,0,0" TextWrapping="Wrap" Text="{Binding UC1, ElementName=root}" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.017,0.304"/>

再次,这部分似乎很好,它正在获取数据到ViewModelStringProperty的视图模型,而不是。

在(视图的)代码后面的依赖属性绑定到其视图模型的属性时,我做错了什么?

为了确保您在TextBox中的更改立即推送到DependencyProperty并随后推送到视图模型,请确保您在TextBox.Text绑定上有UpdateSourceTrigger=PropertyChanged,即:

Text="{Binding UC1, ElementName=root, UpdateSourceTrigger=PropertyChanged}"

有了这个,我的例子运行得很好。

如果这没有帮助,我建议添加两个额外的TextBlocks,一个绑定到UC1,一个绑定到ViewModelStringProperty,这将使它更容易分辨哪些正在正确更新,例如:

<StackPanel>
    <TextBox Text="{Binding UC1, ElementName=Root, UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock Text="{Binding UC1, ElementName=Root}" />
    <TextBlock Text="{Binding ViewModelStringProperty}" />
</StackPanel>