2013-07-22 89 views
3

我已將ListBox綁定到我的ViewModel,包括ListBox.SelectedItem。我想這取決於是否有一個選擇或不改變視覺狀態,但在初期階段不更新狀態,使其保持在錯誤狀態:爲什麼DataStateBehavior最初不會更新?

<DataStateBehavior Binding="{Binding SelectedCamera}" Value="{x:Null}" TrueState="CameraSettingsUnselected" FalseState="CameraSettingsSelected"/> 

這是爲什麼,以及如何解決它?

回答

3

這裏的問題似乎是,綁定最初評估爲null,因此不會觸發評估和狀態更改所需的更改通知。

我用下面的子類固定它:

public class FixedDataStateBehavior: DataStateBehavior 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.Loaded += (sender, routedEventArgs) => 
      { 
       var bindingExpression = BindingOperations.GetBindingExpression(this, BindingProperty); 
       SetCurrentValue(BindingProperty,new object()); 
       bindingExpression.UpdateTarget(); 
      }; 
    } 
} 

,並用它這樣的:

<FixedDataStateBehavior Binding="{Binding SelectedCamera}" Value="{x:Null}" TrueState="CameraSettingsUnselected" FalseState="CameraSettingsSelected"/> 
+1

你問這個問題,4分鐘前,並回答了自己4分鐘前?這裏有什麼問題? –

+1

是的!沒有! http://stackoverflow.com/help/self-answer –

+0

不知道。謝謝! –

0

上述工程的答案,但我結束了創建一個更通用的行爲類只需使用所有綁定即可,無需單獨指定它們。

public class RefreshDataContextBehavior : Behavior<FrameworkElement> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     this.AssociatedObject.Loaded += AssociatedObject_Loaded; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     this.AssociatedObject.Loaded -= AssociatedObject_Loaded; 
    } 

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     var dc = this.AssociatedObject.DataContext; 
     this.AssociatedObject.DataContext = null; 
     this.AssociatedObject.DataContext = dc; 
    } 
} 

然後只需將其插入XAML像這樣它具有的DataContext對象:

<i:Interaction.Behaviors> 
    <local:RefreshDataContextBehavior /> 
</i:Interaction.Behaviors> 
+0

使用OnDetaching()時要小心。當行爲被破壞時,它並不總是被激發。如果添加一個this.AssociatedObject.UnLoaded事件處理程序並取消訂閱所有內容,則應該是安全的。 –

相關問題