2015-11-02 93 views
2

我真的是WPF中的新手。我嘗試在代碼中爲控件屬性設置默認值,並希望在datacontext(VM)可用時通過數據綁定覆蓋該屬性。但數據綁定在這種情況下不起作用。在'後面的代碼'中設置的WPF控件屬性,忽略綁定後

實施例:

代碼後面:

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參數適用於這種情況,但我想知道技術原因,爲什麼控制屬性在代碼設置後無法綁定?

+1

*不能綁定**之後**它是由代碼設置* - 不是真正的後,綁定發生在'InitializeComponent'(**之前**你覆蓋它),在你的代碼中,你只需覆蓋綁定設置後(意味着不再有約束力)。在該行之後再次嘗試設置綁定。問題是你爲什麼這樣做? – Sinatr

+0

最初我試圖設置一個默認值。但是我已經找到了** FallbackValue **參數,它正在爲此目的而工作。所以這個問題上升了,以瞭解框架是如何工作的... – tcpw

回答

1

XAML是在InitializeComponent()處理,所以這是發生了什麼事:

InitializeComponent(); // binding is set 
panelControl.Visibility = Visibility.Hidden; // binding is removed (value is set) 

可以恢復結合

InitializeComponent(); 
panelControl.Visibility = Visibility.Hidden; 
BindingOperations.SetBinding(panelControl, Control.VisibilityProperty, 
    new Binding() 
{ 
    Path = new PropertyPath(nameof(ViewModel.MyViewModelProperty_IsVisible_ConvertedToVisibility)), 
    Source = viewModelInstance, // this.DataContext ? 
}); 

它會後工作。但是,你不清楚爲什麼你想首先覆蓋綁定。

+0

得到它,如果prorty值在InitializeComponent後被改變,屬性綁定將被移除。 – tcpw

+0

我不想使用它,因爲我找到** FallbackValue ** ... – tcpw

+0

['FallbackValue'](https://msdn.microsoft.com/en-us/library/system.windows.data .bindingbase.fallbackvalue.aspx)用於綁定失敗時(例如,'DataContext == null')。它通常用作*設計時默認值*,但它在運行時也有用法(例如,當轉換器顯式返回'UnsetValue'時) – Sinatr

0

一個簡單的方法來防止代碼更改綁定屬性值,當結合被清除,是使用TwoWay結合模式:

<DockPanel Name="panelControl" 
      Visibility="{Binding MyViewModelProperty_IsVisible_ConvertedToVisibility, 
         Mode=TwoWay}"> 

我發現這個硬盤的方式,當然,哈哈。

實際上,如果您有直接修改控件屬性的原因(與修改綁定屬性相反),那麼使用TwoWay模式是有意義的 - 然後您希望綁定屬性也反映更改。

順便說一句,而不是結合Visibility這是更好地使用綁定到一個布爾值,並使用一個轉換器像BooleanToVisibilityConverter因爲它分離視圖模型查看更好類型的屬性:

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
</Window.Resources> 

... 

<DockPanel Name="panelControl" 
      Visibility="{Binding MyViewModelProperty_IsVisible, 
         Converter={StaticResource BooleanToVisibilityConverter}, 
         Mode=TwoWay}"> 

是的,我知道這是一個古老的問題,並有一個可接受的答案,但我沒有找到其他答案直接提供此解決方案。

相關問題