2009-11-24 97 views
2

我不知道問這個問題的最佳方式(對於不明確的問題標題抱歉),但基本上我想設置一個TextBox的MaxLength屬性使用一個值轉換器,它從數據上下文中傳遞屬性,並將傳入屬性的屬性作爲轉換器參數。我想以一種風格去做所有這些,而不是一個控制一個控制的基礎。下面是一個非風格的方式這樣做的一個示例:WPF綁定到另一個屬性的風格綁定

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" MaxLength="{Binding MyPropertyName, Converter={StatocRespirceMyCoolConverter}, ConverterParameter=TheirPropertyName}" /> 

(在你想知道的情況下,TheirPropertyName表示在具有像一個屬性類型MyPropertyName的屬性[StringMaxLength(15)],其我可以到達並返回值轉換器。) 此外,有沒有什麼辦法可以傳遞MyPropertyName類型而不是實例?我只需要該類型來執行StringMaxLength屬性查找。

無論如何,我怎麼能在風格上做這樣的事情呢?據我已經得到了:

<Setter Property="MaxLength"> 
    <Setter.Value> 
     <Binding Converter="{StaticResource textFieldMaxLengthConverter}" /> 
    </Setter.Value> 
</Setter> 

但是,經過整體的datacontext中的值轉換器,而不是在MyPropertyName對象,我真的不知道,如果我可以把它解析MyPropertyName.TheirPropertyName綁定的一部分在綁定的ConverterParameter屬性上傳遞TheirPropertyName。

任何指導將非常感激!

回答

5

好吧,經過一些更深入的挖掘,我已經認識到這一點令我滿意。我結合的RelativeSource自我,然後解析的Text屬性(綁定表達式,因爲這是一個TextFieldMaxLength轉換器,我假設我的工作對一個TextBox

的造型了在資源字典:

<Style TargetType="TextBox"> 
    <Setter Property="MaxLength"> 
    <Setter.Value> 
     <Binding Converter="{StaticResource textFieldMaxLengthConverter}" RelativeSource="{RelativeSource Self}" /> 
    </Setter.Value> 
    </Setter> 
</Style> 

的使用(基本呈現什麼特別需要做的事情,因爲這一切都在樣式):

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" /> 

爲textFieldMaxLengthConverter Convert方法:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    Control control = value as Control; 
    BindingExpression be = control.GetBindingExpression(TextBox.TextProperty); 
    if (be != null) 
    { 
    string boundPropertyName = be.ParentBinding.Path.Path; 
    // .. boundPropertyName here is MyPropertyName.TheirPropertyname, do some parsing and return a value based on that 
    } 
} 

(顯然,我的實際執行情況有點複雜/處理意外的輸入/使用反射,根據我原來的問題的聲明)。

無論如何,我認爲我會張貼這個解決方案,以防其他人試圖做類似的事情,或者如果可能有更好的方法來做到這一點比我使用的。

+0

+1 ...感謝分享!你能發佈你的ValueConverter的實際實現嗎? – Brent 2011-09-05 19:47:13

+0

嗨布倫特。對不起,當我問這個問題時,我曾在一位前僱主那裏工作過,因爲我已經不在那裏了,所以我不能真正查看我在使用這個工具。我猜我可能使用了boundPropertyName字符串中的值,並對此進行了一些反思,看看是否將StringMaxLengthAttribute應用於該屬性,並將該屬性的值從該屬性中提取出來(如果存在)。 – Jordan0Day 2011-09-06 19:27:59

4

您可以使用多重綁定將lutiple屬性傳遞給您的轉換器,這允許您根據需要對屬性進行綁定,並且如果任何屬性發生更改(即實現INotifyPropertyChanged),綁定將會重新評估。對於你在做什麼,你將不得不使用反射來找到傳入的對象中的一個屬性,該屬性具有與轉換器參數相匹配的特定屬性名稱。我不認爲你最終會使用下面的代碼,但它表明你可以有多個參數綁定到xaml中。包括路徑,轉換器,轉換器參數。林不知道相對來源,但是,但我認爲你可能需要它來做你想做的。看看debugging Data Bindings是一個很好的調試方法。這個技巧是必不可少的我不斷使用它。

<Setter 
    Property="MaxLength"> 
    <Setter.Value> 
     <Binding 
      Converter="{StaticResource textFieldMaxLengthConverter}" 
      RelativeSource="{RelativeSource TemplatedParent}" 
      Path="MyPropertyName" 
      ConverterParameter="TheirPropertyName" /> 
    </Setter.Value> 
    </Setter> 
+0

感謝您的提示,我將檢查該調試方法。 – Jordan0Day 2009-11-25 15:15:10