【发布时间】:2017-03-16 13:43:06
【问题描述】:
我有一个使用 MVVM 的 WPF 表单。在那个 WPF 窗口中,我引用了我的 DataContext:
DataContext="{x:Static modelView:MasterAutoSyncModelView.Instance}"
这个MasterAutoSyncModelView 包含一个ObservableCollection:
public ObservableCollection<AutoSyncJob> Jobs { get; set; }
在窗口中,我有一个ListView,其中包含一个作业列表。作业类如下所示:
public sealed class AutoSyncJob : ObservableModel
{
private string _jobName;
public string JobName
{
get { return _jobName; }
set
{
_jobName = value;
OnPropertyChanged("JobName");
}
}
private bool _isActive;
public bool IsActive
{
get { return _isActive; }
set
{
_isActive = value;
OnPropertyChanged("IsActive");
}
}
}
该列表应检查 CheckBoxes 以查找其 IsActive 属性设置为 true 的作业。
<ListView x:Name="lvJobs"
HorizontalAlignment="Left" VerticalAlignment="Top"
Height="628" Width="205"
Margin="30,62,0,0"
ItemsSource="{Binding Jobs}"
SelectedItem="{Binding SelectedJob, Mode=TwoWay}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Active" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsActive, Mode=TwoWay}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding JobName}" Header="Job Name" Width="150">
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
在我的测试代码的构造函数中,我有两个工作。第一个作业的IsActive 设置为True。第二个设置为 False。
加载窗口时,两个 CheckBox 都是空的,即使 IsActive 设置为 True。
Visual Studio 抱怨找不到IsActive。它正在查看我的 IsActive 属性的视图模型,而不是 Jobs ItemsSource 中的 Job。
重写代码说
<CheckBox IsChecked="{Binding Jobs/IsActive, Mode=TwoWay}"/>
删除此投诉,但窗口在加载时仍然没有选中的 CheckBox。
如何将 IsChecked 属性绑定到从 Jobs ItemsSource 绑定到该行的 AutoSyncJob 上的 IsActive 布尔值,以便根据底层模型显示为选中或未选中?
第二个问题:选中或取消选中 ListView 中的活动框不会触发模型设置器中的代码,即使我将模式设置为 TwoWay。因此,如果我取消选中或选中该框,我希望模型修改其IsActive 属性......但没有通信。我怀疑这是因为 DataTemplate 并没有真正绑定到模型项。
【问题讨论】:
标签: wpf checkbox datatemplate