我真的是 WPF 新手。我试图在代码中为控件属性设置默认值,并希望在数据上下文 (VM) 可用时通过数据绑定(bind)覆盖该属性。但是数据绑定(bind)在这种情况下不起作用。
例子:
代码隐藏:
public partial class MyViewControl : UserControl { public MyViewControl() { InitializeComponent(); // it works if I remove this line panelControl.Visibility = Visibility.Hidden; } }
xaml 用户控件:
<DockPanel Name="panelControl" Visibility="{Binding
MyViewModelProperty_IsVisible_ConvertedToVisibility}">
xaml 主窗口:
<my:MyViewControl DataContext="{Binding ElementName=lbListBox,
Path=SelectedItem}"/>
其实FallbackValue参数适用于这种场景,但我想知道技术原因,为什么控件属性在代码设置后无法绑定(bind)?
最佳答案
Xaml 在 InitializeComponent()
期间被处理,所以这是正在发生的事情:
InitializeComponent(); // binding is set
panelControl.Visibility = Visibility.Hidden; // binding is removed (value is set)
可以恢复绑定(bind)
InitializeComponent();
panelControl.Visibility = Visibility.Hidden;
BindingOperations.SetBinding(panelControl, Control.VisibilityProperty,
new Binding()
{
Path = new PropertyPath(nameof(ViewModel.MyViewModelProperty_IsVisible_ConvertedToVisibility)),
Source = viewModelInstance, // this.DataContext ?
});
它会在之后工作。但是并不清楚为什么要首先覆盖绑定(bind)。
关于c# - 在 'code behind' 中设置的 WPF 控件属性,之后忽略绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473070/