在(视图的)代码后面的依赖属性绑定到其视图模型的属性时,我做错了什么?
本文关键字:属性 视图 模型 错了 什么 绑定 代码 依赖 | 更新日期: 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>