2010-12-22 43 views
0

我有兩個屬性FirstName和LastName,並綁定到使用Multibinidng和轉換器的文本塊,以顯示FullName作爲名字+姓氏。Converter中進行的更改會通知綁定屬性的更改嗎?

姓=「紀」 姓氏=「庫瑪」

在我改變了姓氏爲「變文」

values[1] = "Changed Text"; 

執行轉換我的TextBlock會顯示「紀變文後,轉換器「但依賴屬性LastName仍然有最後一個值」Kumar「。爲什麼我在執行後沒有在LastName屬性中獲取「更改文本」值?

轉換器所做的更改是否會通知綁定屬性?

<Window.Resources> 
    <local:NameConverter x:Key="NameConverter"></local:NameConverter> 
</Window.Resources> 
<Grid> 
    <TextBlock> 
     <TextBlock.Text> 
      <MultiBinding Converter="{StaticResource NameConverter}"> 
       <Binding Path="FirstName"></Binding> 
       <Binding Path="LastName"></Binding> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 
</Grid> 

轉換器:

public class NameConverter:IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     values[1] = "Changed Text"; 
     return values[0].ToString() + " " + values[1].ToString(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

回答

0

將在轉換器所做的更改將通知綁定屬性?

編號轉換器用於轉換綁定值 - 不修改它們。您應該在更合適的位置執行此操作,例如依賴性屬性強制或視圖模型中。

0

對象[]你作爲轉換方法的參數是屬性值的兩個綁定已被評估之後。屬性的值已被複制到數組中,並且通過爲元素分配值,您只是更改數組,而不是值來自的屬性。

如果要更改具有這些屬性的原始對象,可以爲該類創建一個普通的valueconverter並綁定到該對象本身。像這樣:

public class NameConverter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Person p = value as Person; 
     if (p == null) { return null; } 
     p.LastName = "Changed Text"; 
     return p.FirstName + " " + p.LastName; 
    } 
// ... 
} 

當然,那麼就不需要MultiBinding了。你可以只綁定到對象本身:

<TextBlock Text="{Binding Converter={StaticResource NameConverter}}"/> 
+0

不會工作,因爲Person屬性本身沒有改變 - 只有它的名字是。因此,綁定不會被刷新,轉換器不會被調用。 – 2010-12-22 08:14:00