控件的名称即使存在也不存在

时间:2011-07-04 14:14:55

标签: c# windows-phone-7 controls

我收到一个错误,当前上下文中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.");
            }

        }

3 个答案:

答案 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控件,因为它们不是WindowPage(或其他任何)类的成员。 This article有一个解决方案。基本上,订阅您想要的控件的Loaded事件,并在后面的代码中,保存事件的sender参数,这是有问题的控件。