Название элемента управления не существует, даже если оно существует - PullRequest
2 голосов
/ 04 июля 2011

Я получаю сообщение об ошибке, когда 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 ]

2 голосов
/ 04 июля 2011

Если файлов много, флажков будет много. Как бы вы различали их при указании одного имени?

Не ссылаться на View (элемент управления) в ViewModel. Замените коллекцию строк (коллекцию имен файлов) коллекцией File. Убедитесь, что класс File имеет два свойства: Name и IsSelected.

Затем свяжите содержимое флажка с именем, а свойство IsChecked со свойством IsSelected.

Таким образом, вам нужно только проверить свойство IsSelected в ViewMODEL, а не в представлении.

Предложение

    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.");
    }
}
0 голосов
/ 04 июля 2011
Элементы управления

DataTemplate недоступны по имени в коде, поскольку они не являются членами вашего класса Window или Page (или чего-либо еще). Эта статья имеет решение.По сути, подпишитесь на событие Loaded нужного элемента управления и в приведенном ниже коде сохраните параметр события sender, которым является рассматриваемый элемент управления.

0 голосов
/ 04 июля 2011

Если флажок находится внутри списка, вы не можете получить к нему доступ напрямую. Вы должны сделать это так:

CheckBox chkBox1 = (CheckBox)lstBox1.Controls[index_of_the_list_item].FindControl("chkBox1");

Только тогда вы можете работать с этим флажком:

if(chkBox1.checked ){}

Вы должны использовать ID, чтобы найти элемент управления, а не его имя. И как-то нужно знать, какой индекс списка вы хотите проверить ...

...