MVVM绑定Observable Collection来查看?

时间:2014-11-27 15:35:36

标签: c# wpf xaml mvvm

在我的应用程序中,我需要将一个复选框列表绑定到一个可观察的集合。我见过很多例子,但我找不到合适的实现,这就是我发布这个问题的原因。

观点:

<Grid Name="GrdMain" Background="White">    
    <ListView Name="lstConditions" VerticalAlignment="Top" Height="150" 
                ItemsSource="{Binding ConditionsModels}" Margin="0,25,0,0" BorderBrush="Transparent" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox Content="{Binding Path=condition}" Margin="8" Style="{StaticResource CheckBoxDefault}"
                                IsChecked="{Binding hasCondition,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                </StackPanel>                    
            </DataTemplate>
        </ListBox.ItemTemplate>    
    </ListView>
</grid>     

模特:

public class ConditionsModel
{
    public int profileId { get; set; }
    public string condition { get; set; }
    public bool hasCondition { get; set; }
}

视图模型:

public class ConditionsViewModel : INotifyPropertyChanged
{

    private ConditionsModel _conditionsModel;
    private ObservableCollection<ConditionsModel> _conditionsModels;

    public ConditionsModel ConditionsModel
    {
        get
        {
            return _conditionsModel;
        }
        set
        {
            _conditionsModel = value;
            RaisePropertyChanged("ConditionsModel");
        }
    }


    public ObservableCollection<ConditionsModel> ConditionsModels
    {
        get
        {
            return _conditionsModels;
        }
        set
        {
            _conditionsModels = value;
            RaisePropertyChanged("ConditionsModels");
        }
    }


    public ConditionsViewModel(int profileId)
    {
        ConditionsModel = new ConditionsModel();
        ConditionsModels = new ObservableCollection<ConditionsModel>();
        ConditionsModels.CollectionChanged += ConditionsModels_CollectionChanged;
        GetConditions(profileId);
    }

    void ConditionsModels_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        RaisePropertyChanged("ConditionsModels");
    }


    private void GetConditions(int profileId)
    {
        HealthAssessmentRepository _rep = new HealthAssessmentRepository();
        _conditionsModels = _rep.GetConditions(profileId);
    }
}

这是正确的实施吗?我需要在用户选中或取消选中复选框时更新模型。但是当选中或取消选中复选框时,它不会提升属性更改事件。我应该在模型上实现INotifyPropertyChanged接口吗?

我见过很多例子,但他们都有不同的方法,我很困惑。请说明这个的正确实现?

由于

2 个答案:

答案 0 :(得分:1)

我认为您错过了DataTemplate中的 DataType 属性。请参阅this

<DataTemplate DataType="{x:Type sampleApp:ConditionsModel}">

此处 sampleApp 位于标记内创建的命名空间参考中。 ConditionsModel 是您的模型类。

答案 1 :(得分:0)

您需要为类INotifyPropertyChanged实施ConditionsModel并为您要观察/同步的属性引发PropertyChangedEvent,因为它也是ViewModel。

对于课程ConditionsViewModel,它是整个ListView的ViewModel,对于ConditionsModel,它是每一行的ViewModel。 ViewModel可以叠加。如果ConditionsModel是域模型,我的建议是添加一个新的ItemViewModel,因为它们属于不同的层。最好是正确区分不同的层。