2011-06-08 75 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