我在xaml的每个单元格中都有一个带有矩形的网格。我知道我可以将每个矩形的填充绑定到我的ViewModel中的属性,但是我希望将每个矩形的填充绑定到ViewModel中的方法并传入矩形的x和y坐标,并得到返回填充(可以在运行时更改)。
有一种简单的方法吗?我不知道这是否可能,因为当方法更改为特定x和y坐标返回的填充时,视图如何知道该方法更新了该值?
我面临的问题是,由于ViewModel不知道View上的任何UI控件,我不能直接更改矩形的填充颜色。此外,由于网格可能很大,我不能为每个矩形都有一个单独的属性。
答案 0 :(得分: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
答案 1 :(得分: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框架,如果我没有弄错,其中一些支持绑定到方法。
查看Caliburn或MVVMLight
HTH
答案 2 :(得分:0)
绑定不能用作调用方法和传递参数的方法。它只是一种在视图和视图模型之间同步状态的机制。
在您的情况下,视图模型需要知道矩形的坐标以确定填充。因此,对于每个矩形,您的视图模型都需要公开X, Y, Fill
属性。
这里的一个大问题是如何使用X&amp; amp;提供视图模型。 Y坐标?我猜这些矩形是在某种容器内,决定了它们的位置?如果是这样,我能想到的唯一技术是为UIElement创建一个附加行为,通过TransformToVisual计算其位置。例如见:
http://forums.silverlight.net/forums/p/12160/414862.aspx
这可以绑定到你的X&amp;视图模型中的Y值。
但是,老实说,如果你努力让MVVM在这里工作,也许这是错误的模式?
如果您只是构建一个由彩色矩形组成的UI,我只需要在循环中执行它,添加矩形并在代码隐藏中着色它们!
KISS(保持简单愚蠢!)