2017-03-27 16 views
1

WPFとMVVMの新機能です。WpfでのデータバインディングMVVM

mysqlデータベースからObservableCollectionにデータを取得しようとしましたが、UIにバインドしています。

モデルレイヤーの最初のObservableCollectionにデータがありますが、ViewModelレイヤーにデータを送信できないため、何もUIにバインドされません。

class Databasecon 
{ 
    int i = 0; 

    // First Binding for the Database 
    public ObservableCollection<Operator> operators { get; private set; } 

    public Databasecon() 
    { 
     this.operators = new ObservableCollection<Operator>(); 
    } 

    public void Datacon(string conn) 
    { 
     MySqlConnection con = null; 
     MySqlCommand com = null; 
     MySqlDataReader myreader = null; 
     int columnOrdinaloperatorname = -1; 

     con = new MySqlConnection(conn); 
     try 
     { 
      if (com == null) 
      { 
       com = new MySqlCommand("SELECT operator_name FROM operators", con); 
       com.Connection.Open(); 

       myreader = com.ExecuteReader(); 
       columnOrdinaloperatorname = myreader.GetOrdinal("operator_name"); 

       while (myreader.Read()) 
       { 
        this.operators.Add(new Operator() { operatorname = myreader.GetString(columnOrdinaloperatorname).ToString() }); 

        i++; 
       } 
      } 

      MessageBox.Show(operators.Count.ToString()); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
     finally 
     { 
      if (myreader != null) 
       myreader.Close(); 

      if (com != null) 
      { 
       if (com.Connection != null) 
        com.Connection.Close(); 
      } 
     } 
    } 
} 

class Operator 
{ 
    public string operatorname { get ; set; } 
} 

class collect : INotifyPropertyChanged 
{ 
    private Databasecon databasecon = null; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<Operator> operators 
    { 
     get 
     { 
      if (this.databasecon.operators != null) 
      { 
       return this.databasecon.operators;     
      } 
      else 
      { 
       return null; 
      } 
     } 
     set 
     { 
      this.operators = value; RaisePropertyChanged("operators"); 
     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public collect() 
    { 
     this.databasecon = new Databasecon(); 
    } 
} 

XAMLコードは次のとおりです。

<Window.DataContext> 
    <vm:collect/> 
</Window.DataContext> 
<Grid> 
    <TextBlock Margin="459,51,-459,-51"><InlineUIContainer> 
       <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{Binding Path=operators}" Width="198" FontSize="28" Height="66"/> 
      </InlineUIContainer></TextBlock> 
    <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="102" Margin="115,240,0,0" VerticalAlignment="Top" Width="339" ItemsSource="{Binding operators}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock > 
         <Run Text="{Binding operatorname}"></Run> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

誰もこれで私を助けることができますか?

答えて

0

あなたのバインディングは私には罰金に見える - ここで私はそれらをテストするためにやったことだ:

<Window.DataContext> 
    <vm:collect/> 
</Window.DataContext> 
<Grid> 
    <Button VerticalAlignment="Top" HorizontalAlignment="Left" Command="{Binding AddThings}" Height="25" Width="Auto">Add Stuff</Button> 
    <TextBlock Margin="459,51,-459,-51"><InlineUIContainer> 
      <TextBlock x:Name="textBlock" TextWrapping="Wrap" Text="{Binding Path=operators}" Width="198" FontSize="28" Height="66"/> 
     </InlineUIContainer></TextBlock> 
    <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="102" Margin="115,240,0,0" VerticalAlignment="Top" Width="339" ItemsSource="{Binding operators}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock > 
        <Run Text="{Binding operatorname}"></Run> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

のC#:

class Databasecon 
{ 
    int i = 0; 

    // First Binding for the Database 
    public ObservableCollection<Operator> operators { get; private set; } 

    public Databasecon() 
    { 
     this.operators = new ObservableCollection<Operator>(); 
    } 

    public void Datacon() 
    { 
      this.operators.Add(new Operator() { operatorname = "Hello world!"}); 
    } 
} 

class Operator 
{ 
    public string operatorname { get; set; } 
} 

class collect : INotifyPropertyChanged 
{ 
    private Databasecon databasecon = null; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ICommand AddThings { get; set; } 

    public ObservableCollection<Operator> operators 
    { 
     get 
     { 
      if (this.databasecon.operators != null) 
      { 
       return this.databasecon.operators; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     set 
     { 
      this.operators = value; RaisePropertyChanged("operators"); 
     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public collect() 
    { 
     this.databasecon = new Databasecon(); 
     AddThings = new SimpleCommand(() => databasecon.Datacon()); 
    } 
} 

public class SimpleCommand : ICommand 
{ 
    private Action _command; 

    public SimpleCommand(Action command) 
    { 
     _command = command; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     if (_command != null) 
      _command(); 
    } 
} 

あなたの問題は、あなたのデータコンテキストを設定している方法であるのかもしれません。現在、ウィンドウはインスタンス化されるたびにビューモデルの新しいインスタンスを作成していますが、名前を設定しないので、このインスタンスはウィンドウでのみ使用されていると見なします。あなたはVMのパブリックプロパティを作成し、ウィンドウがコレクションを移入するために保持しているインスタンスを呼び出すことができます。

<Window.DataContext> 
    <vm:collect x:Name="Collect"/> 
</Window.DataContext> 


window.Collect.Datacon("[My connection string]"); 

それとも、ビューモデルのコンストラクタに使用し、そこにそれを設定する予定のインスタンスを渡します。

public MainWindow(object viewModel) 
    { 
     DataContext = viewModel; 
     InitializeComponent(); 
    } 
+0

あなたの答えをありがとう。あなたは私にどのように私はこのバインディングUIでICommandインターフェイスを使用してバインドを説明しないでください – Ahmad

+0

私はあなたが何を意味するのかよく分かりません。 UIの読み込み時にあなたのリストを準備することを意味しますか? その場合は、collectコンストラクタのdatabasecon.Datacon( "[connection string]")への呼び出しを追加するだけです。 – Jonny

+0

あなたの助けに感謝して今すぐ仕事です http://stackoverflow.com/questions/18593720/window-load-event-in-mvvm これは私が必要だったものです – Ahmad

関連する問題