在我的应用程序中,我需要将一个复选框列表绑定到一个可观察的集合。我见过很多例子,但我找不到合适的实现,这就是我发布这个问题的原因。
观点:
<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接口吗?
我见过很多例子,但他们都有不同的方法,我很困惑。请说明这个的正确实现?
由于
答案 0 :(得分:1)
我认为您错过了DataTemplate中的 DataType 属性。请参阅this
<DataTemplate DataType="{x:Type sampleApp:ConditionsModel}">
此处
答案 1 :(得分:0)
您需要为类INotifyPropertyChanged
实施ConditionsModel
并为您要观察/同步的属性引发PropertyChangedEvent
,因为它也是ViewModel。
对于课程ConditionsViewModel
,它是整个ListView
的ViewModel,对于ConditionsModel
,它是每一行的ViewModel。 ViewModel可以叠加。如果ConditionsModel
是域模型,我的建议是添加一个新的ItemViewModel,因为它们属于不同的层。最好是正确区分不同的层。