我收到一个错误,当前上下文中chkBox1不存在,任何人都有解决方案吗?
这是XAML:
<ListBox ItemsSource="{Binding Files}" Margin="0,42,0,115" Name="lstBox1">
<ListBox.ItemTemplate>
<DataTemplate >
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding FileName}" Name="chkBox1" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
以下是包含chkBox1的代码:
private void button2_Click(object sender, RoutedEventArgs e)
{
ViewDiskModel model = this.ContentPanel.DataContext as ViewDiskModel;
if (chkBox1.IsChecked == true)
{
model.DeleteSelectedFiles.Execute(null);
MessageBox.Show("Files Successfully Deleted.");
}
else
{
MessageBox.Show("Please select a file to delete.");
}
}
答案 0 :(得分:2)
如果有很多文件,则会有很多复选框。当您指定单个名称时,如何区分这些?
请勿参考ViewModel中的View(控件)。将文件集合替换为字符串集合(文件名集合)。确保File类有两个属性:Name和IsSelected。
然后将复选框的内容绑定到Name,将IsChecked属性绑定到IsSelected属性。
这样你只需要在ViewMODEL中检查IsSelected属性,而不是在视图中。
<强>建议强>
class File : INotifyPropertyChanged // implementation not added
{
private string _name;
public string Name
{
get { return _name; }
set
{
if(_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
private boolean _isSelected;
public boolean IsSelected
{
get { return _isSelected; }
set
{
if(_isSelected != value)
{
_isSelected = value;
OnPropertyChanged("IsSelected");
}
}
}
}
class ViewDiskModel : INotifyPropertyChanged // implementation missing
{
private ObservableCollection<File> _files;
public ObservableCollection<File> Files
{
get
{
return _files;
}
set
{
if(_files != value)
{
_files = value;
OnPropertyChanged("Files");
}
}
}
}
XAML:
<ListBox ItemsSource="{Binding Files}" Margin="0,42,0,115" Name="lstBox1">
<ListBox.ItemTemplate>
<DataTemplate >
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"
Content="{Binding FileName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
然后:
private void Button2_Click(object sender, RoutedEventArgs e)
{
ViewDiskModel model = this.ContentPanel.DataContext as ViewDiskModel;
if(model.Files.Any(file => file.IsSelected))
{
model.DeleteSelectedFiles.Execute(null);
MessageBox.Show("Files Successfully Deleted.");
}
else
{
MessageBox.Show("Please select files to delete.");
}
}
答案 1 :(得分:0)
如果复选框位于列表框内,则无法直接访问它。你必须这样做:
CheckBox chkBox1 = (CheckBox)lstBox1.Controls[index_of_the_list_item].FindControl("chkBox1");
只有这样你才能使用该复选框进行操作:
if(chkBox1.checked ){}
你必须使用ID来查找控件,而不是它的名字。不知何故,您需要知道要检查的列表的索引...
答案 2 :(得分:0)
DataTemplate
控件,因为它们不是Window
或Page
(或其他任何)类的成员。 This article有一个解决方案。基本上,订阅您想要的控件的Loaded
事件,并在后面的代码中,保存事件的sender
参数,这是有问题的控件。