在C#中绑定DataGrid和ObservableCollection

时间:2014-02-10 12:46:06

标签: c# wpf binding datagrid

我有一个函数可以获得一些包含字符串的3个列表。我已经使用ObservableCollection将这3个列表保留在其中。

这是ObservableCollection的定义:

public partial class CreateAreaDialogWindow : System.Windows.Window
    {
        ObservableCollection<Tuple<string, string, string>> _obsCollection = new ObservableCollection<Tuple<string, string, string>>();

    }

使用我已经制作的方法添加列表后,我在一些DataGrid中编写结果。 DataGrid的定义是这样的:

<DataGrid Grid.Column="0" AutoGenerateColumns="True" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" Grid.RowSpan="2" ItemsSource="Binding _obsCollection">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Type" Binding="{Binding Item1}"/>
                <DataGridTextColumn Header="MapTo" Binding="{Binding Item2}"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Item3}"/>
                <DataGridCheckBoxColumn Header="Controller"/>
                <DataGridCheckBoxColumn Header="Service"/>
                <DataGridCheckBoxColumn Header="Injection"/>
            </DataGrid.Columns>
        </DataGrid>

除了3个不同列中的3个字符串列表之外,我还有3个带复选框的列。问题是我不知道如何以正确的方式进行绑定。 例如,如果我把这一行放在我的代码中:

tabela.ItemsSource = _obsCollection;

我得到6列而不是3列,当然它们有相同的内容:我从XAML代码获得的3个(在这种情况下绑定有效),3个来自该行:tabela.ItemsSource = _obsCollection;

当我删除时:tabela.ItemsSource = _obsCollection;我得到一个带有复选框的空表。 所以我知道问题在于绑定错误,但有人知道如何编辑此代码以便我可以删除:tabela.ItemsSource = _obsCollection;并仍然获得包含列表内容和列标题的3列:Type,MapTo和Name?

1 个答案:

答案 0 :(得分:3)

您所需要做的就是设置AutoGenerateColumns="False"并创建类似MyViewModel的内容,这将充当您的datacontext

尝试以下代码:

 public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MyViewModel();  
        }
    }
    public class MyViewModel

    {
          public MyViewModel()
          {
              for (int i = 0; i < 1; i++)
              {
                  _obsCollection.Add(new Tuple<string, string, string>("Test" + i, "Test2" + i, "Test3" + i));   
              }
          }
        ObservableCollection<Tuple<string, string, string>> _obsCollection = new ObservableCollection<Tuple<string, string, string>>();

        public ObservableCollection<Tuple<string, string, string>> MyObsCollection
        {
            get { return _obsCollection; }

        }
    }