【问题标题】:How to bind to a private list in a window?如何绑定到窗口中的私人列表?
【发布时间】:2013-05-22 09:08:38
【问题描述】:

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

【问题讨论】:

    标签: c# wpf binding datagrid


    【解决方案1】:

    您可以在此处查看示例代码:您必须这样做。
    1。将列表移动到视图模型类。
    2。公开该列表的公共属性。
    3。将窗口的数据上下文设置为 viewmodel 类的实例。
    4。将属性绑定到 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;
                }
            }        
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      您必须确保DataGrid 的数据上下文是您的视图模型的一个实例。请参阅http://wpftutorial.net/DataGrid.html 了解更多信息。

      【讨论】:

        【解决方案3】:

        这是不可能的。两个原因

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

        更多信息请关注here

        所以我看到的唯一选择是将您的字段包装在 devdigital 已发布的属性中。

        【讨论】:

          猜你喜欢
          • 2016-10-11
          • 1970-01-01
          • 2018-06-05
          • 1970-01-01
          • 2018-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多