2013-04-12 107 views
1

我有一个Control这是可见性绑定到视图模型,但也允许用户直接关闭控件。理想情况下,我想CloseDialog函数检查Visibility上的绑定,如果存在,直接更新绑定值(即ViewModel的值),而不是覆盖它,但我挣扎着如何实际更新值本身通过绑定更新绑定目标值

public void CloseDialog() 
{ 
    Control visibileObject = this; 

    //Check to ensure we have no binding set, if we do then update the binding expression 
    Binding myBinding; 
#if (!SILVERLIGHT) 
    myBinding = BindingOperations.GetBinding(visibileObject, Control.VisibilityProperty); 

#else 
    BindingExpression bindingExpression = visibileObject.GetBindingExpression(Control.VisibilityProperty); 
    myBinding = bindingExpression.ParentBinding; 
#endif 

    if (myBinding != null) 
    { 
     //Here update binding target to be Visibility.Collapsed 
    } 
} 
+1

为什么不通过关闭请求到VM,让它处理呢?它可以决定它是否可以关闭(例如,未保存的数据)并设置属性(如果可以的话)。 –

+0

顺便说一句,'DependencyObject.SetCurrentValue'将有助于您的请求,但它只是WPF 4/4.5 - 对我的知识没有SL支持。但严重的是,你最好改变你的方法。 –

回答

0

您可以使用BindingExpression的UpdateSource方法来更新源。

bindingExpression.UpdateSource(); 

它将更新您的ViewModel属性与VisibilityProperty的当前值。

但是,您也可以在您的CloseDialog方法中设置控件的可见性。如果存在(双向)绑定,它会自动更新您的属性。

public void CloseDialog() 
{ 
    this.Visibility = Visibility.Collapsed; 
} 
+0

如果我设置了'this.Visibility = Visibility.Collapsed',那么它会覆盖绑定到它的虚拟机,我将不能再次打开对话框。 – Chris

+0

@Chris:那么我怀疑你的绑定是'OneWay'。如果您将其模式设置为“TwoWay”,则绑定应该正确更新而不是被覆盖(请参阅@Niklas的答案)。 – Sphinxxx

0

我可能会误解你,但我会建议知名度绑定到视图模型直接使用转换器将视图模型的值转换为可见的值。如果绑定是TwoWay,则可以更新模型,反之亦然。这可能会在你的XAML代码来完成:

Visibility="{Binding Path=DataContext.Value, 
       ElementName=MyDataProperty, 
       Mode=TwoWay, 
       Converter={StaticResource ValueToVisibiltyConverter}}" 

和转换器会做这样的事,在转换:

public override object Convert(
      object value, 
      Type targetType, 
      object parameter, 
      CultureInfo culture) 
     { 
      if (value == null) 
      { 
       return Visibility.Visible; 
      } 
      if (value.Equals("HideMe") 
      { 
       return Visibility.Collapsed; 
      } 
      return Visibility.Visible; 
     } 

     public override object ConvertBack(
      object value, 
      Type targetType, 
      object parameter, 
      CultureInfo culture) 
    { 
     // TODO! Convert back to view model value 
    }