0

我有一个带有private List<Tuple<string, string, char>> _trasitions. 在同一个窗口中有一个DataGrid名为dataTrans. 如何绑定(最好在 XAML 中)_transitionsdataTrans.ItemsSource

4

3 回答 3

1

您必须将集合公开为公共属性才能绑定到它。

public List<Tuple<string, string, char>> Transitions
{
    get { return this.transitions };
}

我还建议定义一个类型而不是使用 a Tuple,如果您希望 UI 收到集合更改的通知,那么您应该将集合设置为ObservableCollectiona 而不是 a List

如果集合引用发生更改,您还需要在引用更改时实现INotifyPropertyChanged并调用PropertyChanged事件(例如在 setter 中)。

要绑定 a DataGrid,请设置其ItemsSource属性:

<DataGrid ItemsSource="{Binding Transitions}" ... />

您必须确保 的数据上下文DataGrid是您的视图模型的实例。有关详细信息,请参阅http://wpftutorial.net/DataGrid.html

于 2013-05-22T09:11:27.430 回答
1

您可以在此处查看示例代码:您必须这样做。
1. 将列表移动到视图模型类。
2. 公开该列表的公共属性。
3.将窗口的数据上下文设置为viewmodel类的一个实例。
4. 将Property 绑定到XAML 中数据网格的ItemSource。 XAML
下面给出的示例代码 :

<Window x:Class="TestWPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestWPFApp"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <DataGrid ItemsSource="{Binding Transitions}" AutoGenerateColumns="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="firstColumn" Header="First" Binding="{Binding Path=Item1, Mode= OneWay}"></DataGridTextColumn>
                <DataGridTextColumn x:Name="secondColumn" Header="Second" Binding="{Binding Path=Item2, Mode= OneWay}"></DataGridTextColumn>
                <DataGridTextColumn x:Name="thirdColumn" Header="Third" Binding="{Binding Path=Item3, Mode= OneWay}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

代码背后:

using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System;
namespace TestWPFApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

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

    public class MainViewModel
    {
        private List<Tuple<string, string, char>> _transitions = new List<Tuple<string, string, char>>();

        public MainViewModel()
        {
            Transitions.Add(new Tuple<string,string,char>("First Item 1","Second Item 1",'A'));
            Transitions.Add(new Tuple<string, string, char>("First Item 2", "Second Item 2", 'B'));
            Transitions.Add(new Tuple<string, string, char>("First Item 3", "Second Item 3", 'C'));
            Transitions.Add(new Tuple<string, string, char>("First Item 4", "Second Item 4", 'D'));
        }
        public List<Tuple<string, string, char>> Transitions
        {
            get { return _transitions; }
            set
            {
                _transitions = value;
            }
        }        
    }
}
于 2013-05-22T09:20:57.400 回答
0

那是不可能的。两个原因

  • 您只能绑定属性。
  • 财产必须是公共的。

欲了解更多信息,请查看这里

因此,我看到的唯一选择是将您的字段包装在一个属性中,因为devdigital已经发布。

于 2013-05-22T09:13:01.667 回答