c# - 在 'code behind' 中设置的 WPF 控件属性,之后忽略绑定(bind)

标签 c# wpf xaml data-binding code-behind

我真的是 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/

相关文章:

c# - WPF ItemsControl 中的重叠项

C# WPF 将 richtextbox 中粘贴的 BitmapImage 转换为二进制

c# - 在自定义 View 上设置可绑定(bind)属性时 ListDictionaryInternal 上的空引用异常

c# - 数据绑定(bind) Int 属性到 WPF 中的枚举

c# - 使用 Fody [ImplementPropertyChanged] 时出错

.net - 如何开始WPF开发?

c# - SmtpClient.SendMailAsync 在抛出特定异常时导致死锁

c# - "IntervalPicker": Customizing datePicker or developing own control?

javascript - 在 C# 和 Fabric.js 中添加对象并保存图像

c# - 如何使用 MS Ole DB 提供程序创建跨两个 foxpro 数据库的连接?