2016-03-31 6 views
0

Databaseからデータを取得する質問と回答を持つListBoxがあります。今、私は表示または "リストボックス"から選択した行のデータを編集したいが、私は問題がどのようにこの行に到達する必要があります。リストボックスから選択したアイテムをデータテンプレートでバインドする

編集。私は何をしたいかを示すための画像: http://imgur.com/5NHjYA4

マイビュー:

<Window x:Class="QuizMaker.MainWindow" 
    <Window.DataContext> 
     <local:MainViewModel /> 
    </Window.DataContext> 

    <Window.Resources> 
     <DataTemplate x:Key="QuestionsTemplate"> 
      <Grid>  
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="320" /> 
        <ColumnDefinition Width="120" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="20" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Grid.Column="0" Text="{Binding Path=Question}" FontWeight="Bold" /> 
       <TextBlock Grid.Column="1" Text="{Binding Path=AnswerA}" /> 
       <TextBlock Grid.Column="2" Text="{Binding Path=AnswerB}"/> 
       <TextBlock Grid.Column="3" Text="{Binding Path=AnswerC}"/> 
       <TextBlock Grid.Column="4" Text="{Binding Path=AnswerD}"/> 
       <TextBlock Grid.Column="5" Text="{Binding Path=RightAnswer}" FontWeight="Bold"/> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid>   
     <ListBox DataContext="{Binding MyDataSet}" 
        x:Name="listBox" 
        ItemsSource="{Binding Path=QuestionTable}" 
        ItemTemplate="{StaticResource QuestionsTemplate}" 
        SelectedItem="{Binding SelectedItemString}"    
     /> 

    </Grid> 
</Window> 

とViewModelに私がコメントを追加することができませんでした申し訳ありません

{ 
    class MainViewModel 
    { 
     private string _appPath; 

     private MainModel _MainModel; 


     public MainViewModel() 
     { 
      _MainModel = new MainModel(); 


      mdbFile = Path.Combine(AppDataPath, "QuestionBase.mdb"); 
      connString = $"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={mdbFile}"; 
      conn = new OleDbConnection(connString); 

      adapter = new OleDbDataAdapter("SELECT * FROM QuestionTable;", conn); 

      MyDataSet = new DataSet(); 
      adapter.Fill(MyDataSet, "QuestionTable"); 


     } 

     private void AddToDB() 
     { 
      conn.Open(); 
      OleDbCommand myCommand = new OleDbCommand("Insert INTO QuestionTable (Question, AnswerA, AnswerB, AnswerC, AnswerD) Values(@Question, @AnswerA, @AnswerB, @AnswerC, @AnswerD)", conn); 
      myCommand.Parameters.Add("@Question", OleDbType.BSTR).Value = Question; 
      myCommand.Parameters.Add("@Question", OleDbType.BSTR).Value = AnswerA; 
      myCommand.Parameters.Add("@Question", OleDbType.BSTR).Value = AnswerB; 
      myCommand.Parameters.Add("@Question", OleDbType.BSTR).Value = AnswerC; 
      myCommand.Parameters.Add("@Question", OleDbType.BSTR).Value = AnswerD; 
      myCommand.ExecuteNonQuery(); 
      conn.Close(); 
     } 

     private string AppDataPath 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(_appPath)) 
       { 
        _appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
       } 
       return _appPath; 
      } 
     } 

     public OleDbDataAdapter adapter 
     { 
      get 
      { 
       return _MainModel.adapter; 
      } 
      set 
      { 
       _MainModel.adapter = value; 
       OnPropertyChanged("adapter"); 
      } 
     } 
     public DataSet MyDataSet 
     { 
      get 
      { 
       return _MainModel.MyDataSet; 
      } 
      set 
      { 
       _MainModel.MyDataSet = value; 
       OnPropertyChanged("MyDataSet"); 
      } 
     } 
    public string SelectedItemString 
    { 
     get 
     { 
      return _MainModel.SelectedItemString; 
     } 
     set 
     { 
      _MainModel.SelectedItemString = value; 
      OnPropertyChanged("SelectedItemString"); 
     } 
    } 


     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 





    } 
} 
+0

正確に何を求めていますか?どのようにデータベースからデータを取得する? –

+0

これは話題にはなりませんが、 'AddToDB()'メソッドでは、 '@ Question'パラメータを5回、その他の4つのパラメータをまったく設定していないコピー/ペーストのバグがあるようです。 –

+0

[ListBoxアイテムのWPF DataTemplateを選択した場合は、WPF DataTemplateを変更する]の可能な複製(0120-917-383)/変更 - WPF-DataTemplate-for-listbox-item-if-selected) –

答えて

0

を(私はプロパティのほとんどをカット)。 TextBoxから値を変更する際に、選択したアイテムの値をTextBoxに表示し、同じ値をコレクション(あなたのケースのDataTable)に更新することが欲しいと思います。それはあなたの要件がこの

<TextBox x:Name="ValueText" Text="{Binding SelectedItem.ColumnName, ElementName=listBox, UpdateSourceTrigger=PropertyChanged}" /> 

のようなあなたのTextBoxのバインディングを変更されている場合は、文字列型のSelectedItemStringプロパティにのSelectedItemを結合している理由を私は知りません。ソースごとにバインディングエラーが作成されます。

0

SelectedItemStringプロパティをDataRowに変更し、他のコントロールをバインドします。

例えば、

public DataRow SelectedItem 
{ 
    get 
    { 
     return _MainModel.SelectedItem; 
    } 
    set 
    { 
     _MainModel.SelectedItem = value; 
     OnPropertyChanged("SelectedItem"); 
    } 
} 

そして、XAMLではこのようなものでなければなりません:あなたは本当にあなたが選択した項目を追跡する方法を変更したくない場合、あなたは可能性も

<Window x:Class="QuizMaker.MainWindow" 
    <Window.DataContext> 
     <local:MainViewModel /> 
    </Window.DataContext> 

    <Window.Resources> 
     <DataTemplate x:Key="QuestionsTemplate"> 
      <Grid>  
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="320" /> 
        <ColumnDefinition Width="120" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="20" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Grid.Column="0" Text="{Binding Path=Question}" FontWeight="Bold" /> 
       <TextBlock Grid.Column="1" Text="{Binding Path=AnswerA}" /> 
       <TextBlock Grid.Column="2" Text="{Binding Path=AnswerB}"/> 
       <TextBlock Grid.Column="3" Text="{Binding Path=AnswerC}"/> 
       <TextBlock Grid.Column="4" Text="{Binding Path=AnswerD}"/> 
       <TextBlock Grid.Column="5" Text="{Binding Path=RightAnswer}" FontWeight="Bold"/> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 

    <DockPanel> 
     <ContentControl Content="{Binding SelectedItem}" 
         ContentTemplate="{StaticResource QuestionsTemplate}" 
         DockPanel.Dock="Top" /> 

     <ListBox DataContext="{Binding MyDataSet}" 
        x:Name="listBox" 
        ItemsSource="{Binding Path=QuestionTable}" 
        ItemTemplate="{StaticResource QuestionsTemplate}" 
        SelectedItem="{Binding SelectedItem}"    
     /> 

    </DockPanel> 
</Window> 

listBox.SelectedItemのように直接結びついてくださいDavys said

関連する問題