2011-07-04 13 views
2

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番目のブロックの用量はchkBox1への参照を持っています –

+0

@トムスクワイア これはありませんか? 'if(chkBox1.IsChecked == true)'私はこれも正しいと思います。 – lala

+0

コードが変更されました –

答えて

2

多くのファイルがある場合、多くのチェックボックスがあります。あなたは単一の名前を指定するとき、これらをどのように区別しますか?

ViewModelのView(コントロール)を参照しないでください。文字列コレクション(ファイル名コレクション)をFileのコレクションに置き換えます。 FileクラスにNameとIsSelectedの2つのプロパティがあることを確認します。

次に、チェックボックスの内容をNameに、IsCheckedプロパティをIsSelectedプロパティにバインドします。

このようにすると、ビューではなくViewMODELでIsSelectedプロパティをチェックするだけで済みます。その後

<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> 

提案

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

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

あなたのアイデアは素晴らしいですが、私はどこを変更するか分からない。 – lala

+0

ViewDiskModelクラスのコードを投稿してください。例を挙げます。 –

+0

質問を編集し、ViewDiskModelクラスを追加しました。 – lala

0

チェックボックスを使って、直接アクセスすることはできませんリストボックス内にある場合。あなたはそのようにそれをしなければならない。

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

だけにして、あなたはそのチェックボックスを使用して動作することができます

if(chkBox1.checked){} 

あなたはそれが名前だではない、しかしコントロールを見つけるためにIDを使用する必要があります。彼らはあなたのWindowまたはPage(または任意の他)クラスのメンバーではないので、何とかあなたがチェックしたいリストのどのような指標を知っている必要があります...

+0

現在、[index_of_the_list_item]が現在のコンテキストに存在しないエラーが表示されます。 – lala

+0

私はあなたの貢献のためにそれを解決しました:) – lala

0

DataTemplateコントロールは、背後にあるコードでは、名前では使用できません。 This articleには解決策があります。基本的には、希望のコントロールのLoadedイベントを購読し、そのコードの背後に、問題のコントロールであるイベントのsenderパラメータを保存します。

+0

あなたの貢献に感謝 – lala

関連する問題