【问题标题】:Silverlight MVVM binding and use of extended class propertySilverlight MVVM 绑定和扩展类属性的使用
【发布时间】:2011-06-08 10:08:59
【问题描述】:

我有一个包含 city 和 country 属性的类,我对其进行了扩展以结合这两个值。

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

这是通过 RIA 服务向 Silverligt 公开的,我有一个扩展

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

在我的 XAML 中,一个数据网格正在使用 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>

此数据网格绑定到一个数据表单,我可以在其中使用双向绑定编辑 Country 和 City 属性。但是我应该如何使用新值来“更新”数据网格呢?触发 AreaString 属性的新获取。

【问题讨论】:

    标签: silverlight mvvm


    【解决方案1】:

    当您触摸 City 或 Country 时,您也应该通知 AreaString 的 PropertyChanged 事件。 为了实现这一点,您还应该让 Area 实现INotifyPropertyChanged 如何使用它的示例是here

    【讨论】:

    • 网格绑定的 AreaCollection 是我的 ViewModel 中的 ObservableCollection。即使在 Area 类上实现 INotifyPropertyChanged 时,我也不太明白应该如何处理/捕获视图模型中的属性更改
    • @Kman 为了观察集合中的单个元素,即使元素也必须是“可观察的”,因此您需要实现 INotifyPropertyChanged
    • 我已将接口添加到我的部分类定义中,但恐怕我看不到下一步该去哪里
    • @Kman 问题出在使用 INotifyPropertyChange 实现上吗?我在回复中添加了一个示例链接
    【解决方案2】:

    在实现 INotfiyPropertyChanged 接口后添加OnPropertyChanged,如下所示:

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

    您还应该在 City AND Country setter 中添加 OnPropertyChanged("AreaString");

    更新

    另一种方法是扩展您的实体中存在的OnCityChangedOnCityChanging 部分方法。喜欢:

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

    【讨论】:

    • 在 getter 中调用 PropertyChanged 有什么好处?该代码甚至会在返回之后执行吗?如果它确实执行了,会不会导致无限循环,因为每次检索值时,它都会告诉 silverlight 该值已更改,应该再次读取。
    • 但是我需要更改原始课程,我真的不想这样做。也许更好的解决方案是在数据网格中使用模板列
    • @Kman - 查看更新。如果您要暴露实体?如果没有,那么第一种方法应该仍然适合你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2014-04-10
    • 2013-01-10
    相关资源
    最近更新 更多