繁体   English   中英

如何将属性数据绑定到方法并传入参数?

[英]How do I databind a property to a method and pass in parameters?

我在 xaml 的每个单元格中有一个矩形网格。 我知道我可以将每个矩形的填充绑定到 ViewModel 中的一个属性,但我想将每个矩形的填充绑定到 ViewModel 中的一个方法,并传入矩形的 x 和 y 坐标,然后得到回填(可以在运行时更改)。

是否有捷径可寻? 我不知道这是否可能,因为当方法更改它为特定 x 和 y 坐标返回的填充时,视图如何知道该方法更新了该值?

我面临的问题是,由于 ViewModel 不知道 View 上的任何 UI 控件,我不能直接更改矩形上的填充 colors。 此外,由于网格可能很大,我不能为每个矩形设置单独的属性。

这在您的方案中可能不起作用,但您可以使用 ObjectDataProvider 从绑定中调用方法。 这是一个简单的例子:

<Window.Resources>
  <local:StringToDoubleConverter x:Key="stringToDouble" />

  <local:MyObject x:Key="objInstance" />

  <ObjectDataProvider
    x:Key="odp"
    ObjectInstance="{StaticResource objInstance}"
    ObjectMethod="MyMethod"
    >
    <ObjectDataProvider.MethodParameters>
      <sys:Double>0</sys:Double>
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>
</Window.Resources>

现在,您视图中的一个元素,比如 TextBox 可以绑定到方法参数:

<TextBox Text={Binding Source={StaticResource odp}, Path=MethodParameters[0], UpdateSourceTrigger=PropertyChanged, Converter={StaticResource stringToDouble}} />

然后可以在其他地方的绑定中使用方法返回值:

<Label Content="{Binding Source={StaticResource odp}}" ContentStringFormat="Method returned: {0}" />

同样,这在您的场景中可能不起作用,但它确实说明了一种将参数传递给方法并完全在 XAML 中使用返回值的方法。 以下是有关更多信息的资源: http://bea.stollnitz.com/blog/?p=22

您可以尝试为此使用IValueConverter

[ValueConversion(typeof (MyCoordObject), typeof (Brush))]
public class CoordToBrushConverter : ConverterExtension
{
   public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var coordObject= (MyCoordObject) value;

        if (coordObject.X == 132) return Brushes.Red; 
        //define your own brushes as StaticResource or something, this won't work
        return Brushes.Black;
    }


    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //nothing
        return value;
    }
}

现在你只需要弄清楚你想将哪个 object 传递给转换器。 在您的 XAML 中使用它,如下所示:

<my:CoordToBrushConverter x:key="myConverter"/>
<TextBox BackgroundBrush={Binding myObj, Converter={StaticResource myConverter}} />

如果您没有包含坐标的 object,也许您可以使用 MultiValueConverter 并从控件中一一传递坐标? 您应该玩弄它以使其正常工作。

如果您不想使用转换器,您可以随时查看一些 MVVM 框架,如果我没记错的话,其中一些支持绑定到方法。
检查CaliburnMVVMLight

HTH

绑定不能用作调用方法和传递参数的方式。 它只是一种在您的视图和您的视图 model 之间同步 state 的机制。

在您的情况下,视图 model 需要知道矩形的坐标才能确定填充。 因此,对于每个矩形,您的视图 model 需要公开X, Y, Fill属性。

这里的大问题是如何为视图 model 提供 X 和 Y 坐标? 我猜这些矩形是在某种容器内,它决定了它们的位置? 如果是这样,我能想到的唯一技术是为通过 TransformToVisual 计算其 position 的 UIElement 创建附加行为。 参见例如:

http://forums.silverlight.net/forums/p/12160/414862.aspx

然后可以将其绑定到视图 model 中的 X 和 Y 值。

然而,老实说,如果你很难让 MVVM 在这里工作,也许这是错误的模式?

如果您只是构建一个由彩色矩形组成的 UI,我会在一个循环中进行,添加矩形并在代码隐藏中为它们着色!

亲吻(保持简单愚蠢!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM