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
    }
}
4

2 回答 2

0

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

bindingExpression.UpdateSource();

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

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

public void CloseDialog()
{
  this.Visibility = Visibility.Collapsed;
}
于 2013-04-12T09:14:40.187 回答
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
    }
于 2013-04-12T12:54:45.177 回答