2011-06-28 61 views
0

我在xaml中的每个单元格中都有一个带有矩形的网格。我知道我可以将每个矩形的填充绑定到ViewModel中的属性,但是我想将每个矩形的填充绑定到ViewModel中的方法,并传入矩形的x和y坐标,并获取回填(可以在运行期间更改)。如何将属性绑定到方法并传递参数?

有没有简单的方法来做到这一点?我不知道这是否可能,因为当方法改变填充时,它会返回特定的x和y坐标,视图如何知道方法更新了该值?

我面对的问题是,由于ViewModel不知道视图上的任何UI控件,我不能直接更改矩形上的填充颜色。此外,由于网格可能很大,因此每个矩形都不能有单独的属性。

回答

0

你可以尝试使用此一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; 
    } 
} 

现在你只需要找出哪些对象,你想传递给该转换器。在XAML像这样使用:

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

如果你没有它包含坐标的对象,也许你可以使用一个MultiValueConverter并通过坐标逐个从控制?你应该玩这个,以使它可能工作。

如果你不想使用转换器,你可以随时查看一些MVVM框架,如果我没有弄错它们中的一些支持绑定方法。
检查CaliburnMVVMLight

HTH

+0

什么是CoordObject?这是如何设置的? – ColinE

+0

自定义对象或对坐标的引用。 CoordObject并不存在。我会更新答案以更好地指定。 – RoelF

0

绑定不能用来作为一种方法来调用方法和传递参数。它仅仅是一种同步视图和视图模型之间状态的机制。

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

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

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

这可以被绑定到你的X & Y值在您的视图模型。

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

如果您只是构建一个由彩色矩形组成的UI,我只需在循环中添加矩形,然后在代码隐藏中将它们着色!

KISS(保持简单愚蠢!)

1

这可能不适用于您的场景,但您可以使用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

相关问题