2016-08-21 10 views
0

リストビューとのバインディング方法は? Iクラスをした、私がコレクションをした私は、私はそれが動作しませんバインディングん:リストビューとのバインディングの方法

 public class DrawingVisualObject : DrawingVisual 
     { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public DrawingVisualObject(int id, string name) 
     { 
      Id = id; 
      Name = name; 
     } 
    } 

    ObservableCollection<DrawingVisualObject> mPointNames = new  ObservableCollection<DrawingVisualObject>(); 
    public MainWindow() 
    { 
     this.DataContext = mPointNames; 
     InitializeComponent(); 
     lstv.ItemsSource = mPointNames; 
    } 

    public ObservableCollection<DrawingVisualObject> PointNames 
    { 
     get 
     { 
      return mPointNames; 
     } 
    } 

これは、私はあなたが結合のためのDrawingVisualを使用するように持っていけない

<ListView MinHeight="350" ItemsSource="{Binding DrawingVisualObject, Mode=TwoWay}" Name="lstv"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Id}"/> 
+0

標準のMVVMアーキテクチャはありますか? –

+0

はい、私はMVVMアーキテクチャ –

答えて

1

を書いたXAMLコードです。あなたのViewModelにしたり、モデルのceateクラスのFooItem

public class FooItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public FooItem(int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 
} 

その後、あなたのViewModelであなたのXAMLの使用でのObservableCollection

public ObservableCollection<FooItem> PointNames 
    { 
     get 
     { 
      return mPointNames; 
     } 
    } 

を作成します。

<ListView Margin="10" Name="FooItems" ItemsSource="{Binding Path=PointNames}"> 
     <ListView.View> 
       <GridView> 
         <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" /> 
         <GridViewColumn Header="Id" Width="50" DisplayMemberBinding="{Binding Id}" /> 
       </GridView> 
     </ListView.View> 
</ListView> 

削除より「lstv.ItemsSource = mPointNames ; " Viewコンストラクタから取得します。 MVVMには、initコール、最大イベントハンドラの初期化だけが必要です。依存関係propertysでそれを行う -

は、それが

+0

が動作しません:((私は理解できませんなぜ –

+0

)PointNamesプロパティ、つまりビューモデルクラスを所有するクラスのインスタンスにDataContextを設定します。MainWindowにプロパティがある場合は、 DataContext = this。 – Clemens

+0

うまくいけば、ViewとDataContextの間に問題があるかもしれませんが、Clementsは正しいですが、DataContext = thisを使用するときは注意してください。デバッガのバインディングにコンバータを使用してください。https://spin.atomicobject.com/2013/12/11/wpf-data-binding-debug/のように –

0

あなたの例では、MVVMのように見えるdoesntのが、uは背後にあるコード内のデータを持っているしたい場合に役立ちます願っています。ここで

はXAML

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Test" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    Name="myWindow"> 
<Grid> 
      <ListView ItemsSource="{Binding ElementName=myWindow, Path=DrawingVisualCollection}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"></GridViewColumn> 
       <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Path=Id}"></GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

</Grid> 

ための一例である

コードが背後にあるように見えるこの

namespace Test 
{ 

public class DrawingVisualObject : DrawingVisual 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DrawingVisualObject(int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 
} 

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 

    public ObservableCollection<DrawingVisualObject> DrawingVisualCollection 
    { 
     get { return (ObservableCollection<DrawingVisualObject>)GetValue(DrawingVisualCollectionProperty); } 
     set { SetValue(DrawingVisualCollectionProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for DrawingVisualCollection. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DrawingVisualCollectionProperty = 
     DependencyProperty.Register("DrawingVisualCollection", typeof(ObservableCollection<DrawingVisualObject>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<DrawingVisualObject>())); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     List<DrawingVisualObject> sample = new List<DrawingVisualObject>(); 

     sample.Add(new DrawingVisualObject(1, "Yolo")); 
     sample.Add(new DrawingVisualObject(2, "Swag")); 

     this.FillCollection(sample); 

    } 

    public void FillCollection(IEnumerable<DrawingVisualObject> objects2fill) 
    { 
     this.DrawingVisualCollection.Clear(); 

     foreach(DrawingVisualObject obj in objects2fill) 
     { 
      this.DrawingVisualCollection.Add(obj); 
     } 
    } 


} 

}

これは、のために働く必要があります

覚えておいてください: コレクションが再び初期化されている場合は、バインディングを破棄することがあります。私はFillCollection()メソッドの例でこれを表示しようとしました。つまり、MVVMを使用している場合は、ObservableCollectionを常にプライベートセットに設定する必要があります。

もう一度MVVMに戻すことをお勧めします。ビューモデルの共通基盤が何であるかを知ることは、常に良いことですstart !!!

関連する問題