2011-06-08 34 views
0

我有一個城市和鄉村屬性的類,我擴展了這兩個值的組合。Silverlight MVVM綁定和擴展類屬性的使用

public class Area 
{ 
public string City; 
public string Country; 
} 

這是由RIA服務暴露Silverligt,我有一個擴展

public partial class Area 
{ 
public string AreaString 
{ 
get { return City + ", " + Country;} 
} 

在我的XAML一個DataGrid使用AreaString

<sdk:DataGrid AutoGenerateColumns="False" 
         ItemsSource="{Binding Path=AreaCollection}" 
         Name="dataGrid1" Width="Auto"> 
    <sdk:DataGrid.Columns> 
     <sdk:DataGridTextColumn CanUserReorder="True" IsReadOnly="True" Width="Auto" Binding="{Binding Path=AreaString}" />     
      </sdk:DataGrid.Columns> 
     </sdk:DataGrid> 

這DataGrid綁定到一個dataform,我可以用雙向綁定編輯Country和City屬性。但是,我應該如何使用新值更新數據網格呢?觸發一個新的AreaString屬性。

回答

1

添加OnPropertyChanged像下面你實現INotfiyPropertyChanged後的界面:

public partial class Area 
{ 
    public string AreaString 
    { 
     get 
     { 
      return City + ", " + Country; 
      OnPropertyChanged("AreaString"); 
     } 
    } 
} 

你也應該在城市國家制定者添加OnPropertyChanged("AreaString");

更新

此的替代方法是延長任一OnCityChanged或與您的實體存在的OnCityChanging局部方法。像:

partial void OnCityChanged() 
{ 
    OnPropertyChanged(new PropertyChangedEventArgs("AreaString")); 
} 
+0

調用PropertyChanged在getter中做了什麼好處?該代碼是否會在返回後執行?如果它確實執行,它不會導致無限循環,因爲每次檢索該值時,它都會告訴silverlight該值已更改,應該再次讀取。 – cadrell0 2011-06-08 14:09:25

+0

但是後來我需要改變原來的類,我真的不想這樣做。也許更好的解決方案是在數據網格中使用模板列 – Kman 2011-06-08 14:13:25

+0

@Kman - 請參閱更新。如果你正在揭露實體?如果不是,那麼第一種方式仍然適用於你。 – 2011-06-08 14:19:05

2

當您觸摸城市或國家時,您也應該通知AreaCtring的PropertyChanged事件。 爲了實現這一目標,您還應該使Area實現INotifyPropertyChanged 有關如何使用它的示例是here

+0

網格綁定到的AreaCollection是從我的ViewModel ObservableCollection 。我不太清楚我應該如何處理/捕獲viewmodel中的屬性,即使在Area類 – Kman 2011-06-08 10:18:28

+0

@Kman上實現INotifyPropertyChanged以觀察構造中的單個元素,即使元素必須是「可觀察的「因此你需要實現INotifyPropertyChanged – 2011-06-08 10:19:58

+0

我已經將接口添加到了我的部分類定義中,但是我恐怕看不到下一步該怎麼辦 – Kman 2011-06-08 13:57:50