2011-06-28 54 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

相關問題