none
ListBox DataTempltae 下 TextBlock 的绑定问题 RRS feed

  • 问题

  • <ListBox>
      <ListBox.ItemTemplate>
        
    <DataTemplate x:Name="Item">
          
    <StackPanel>
             
    <TextBlock x:Name="t1" />         </StackPanel>
         
    </DataTemplate>
     
    </ListBox.ItemTemplate>
    </ListBox>

    请问 在xaml里面不确定要绑定 哪一个字段  如何在.cs的Loaded事件中 如何获取到t1设置其绑定字段


    • 已编辑 小携 2011年12月15日 6:24
    2011年12月15日 3:41

答案

  • 你好,

     谢谢你的回答,  你说的这种方法 我知道,

    可是我要实现的功能是: 可以改变列的显示顺序 ,但是 数据源类的数据会一直变化。 所以我觉得,DataTemplate不确定要绑定数据源类哪个字段,如果用个GridData类,但是数据源类通知GridData类,再实时更新会不会更麻烦,才想要在后台绑定比较好 ,就不需要多一个 GridData类 。不知道这样想对不对。

    请问 在后台的时候要如何绑定呢。


    根据你的描述,你可以通过绑定一个中间的字段来不断改变listbox所绑定的数据,你可以试试以下代码。

    .xaml

      <ListBox Name="listBox1"   >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding DisplayField}" x:Name="t1"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    .cs

     public partial class MainPage : PhoneApplicationPage
        {
            private ObservableCollection<GridData> datasource = GridData.GetData();
            public MainPage()
            {
                InitializeComponent();
                listBox1.ItemsSource = datasource;
                DispatcherTimer timer = new DispatcherTimer();
                timer.Tick += new EventHandler(timer_Tick);
                timer.Interval = new TimeSpan(0, 0, 2);
                timer.Start();
    
                DispatcherTimer timer2 = new DispatcherTimer();
                timer.Tick += new EventHandler(timer2_Tick);
                timer.Interval = new TimeSpan(0, 0, 2);
                timer.Start();
            }
    
            void timer_Tick(object sender, EventArgs e)
            {
                foreach (var item in listBox1.Items)
                {
                    var data = item as GridData;
                    if (data.DisplayField == data.LastName)
                        data.DisplayField = data.FirstName;
                    else
                        data.DisplayField = data.LastName;
                }
            }
            void timer2_Tick(object sender, EventArgs e)
            {
                datasource.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "X",
                    LastName = "X"
                });
            }
        }
        public class GridData : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
    
            private string displayField;
            public string DisplayField
            {
                get { return this.displayField; }
                set
                {
                    this.displayField = value;
                    this.NotifyPropertyChanged("DisplayField");
                }
            }
    
            private string firstName;
            public string FirstName
            {
                get { return this.firstName; }
                set
                {
                    this.firstName = value;
                    this.NotifyPropertyChanged("FirstName");
                }
            }
    
            private string lastName;
            public string LastName
            {
                get { return this.lastName; }
                set
                {
                    this.lastName = value;
                    this.NotifyPropertyChanged("LastName");
                }
            }
            public static ObservableCollection<GridData> GetData()
            {
                ObservableCollection<GridData> data = new ObservableCollection<GridData>();
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "John Doe",
                    LastName = "A."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Jane Doe",
                    LastName = "B."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Jason Smith",
                    LastName = "C."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Kayli Jayne",
                    LastName = "D."
                });
                return data;
            }
        } 
    2011年12月16日 7:39
    版主

全部回复

  • 你好,

    以我的经验,TextBlock在xaml里设置绑定比在后台设置绑定要容易得多,你可以试一下以下的代码:

    xaml:

     <ListBox ItemsSource="{Binding}" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Name}" x:Name="t1"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    .cs

    public MainPage()
            {
                InitializeComponent();
                List<string> listitem = new List<string>();
                listitem.Add("item1");
                listitem.Add("item2");
                listitem.Add("item3");
                listitem.Add("item4");
                listitem.Add("item5");
                listitem.Add("item6");
                //  this.DataContext = listitem;
                this.DataContext = GridData.GetData();
                //这里可以是一个List或一个类中的数据。如果是一个如上所示的List,前面只用写Text={Binding}就可以了
            }
    
    public class GridData
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public bool Male { get; set; }
            public static ObservableCollection<GridData> GetData()
            {
                ObservableCollection<GridData> data = new ObservableCollection<GridData>();
                data.Add(new GridData()
                {
                    Name = "John Doe",
                    Age = 30,
                    Male = true
                });
                data.Add(new GridData()
                {
                    Name = "Jane Doe",
                    Age = 32,
                    Male = false
                });
                data.Add(new GridData()
                {
                    Name = "Jason Smith",
                    Age = 54,
                    Male = true
                });
                data.Add(new GridData()
                {
                    Name = "Kayli Jayne",
                    Age = 25,
                    Male = false
                });
                return data;
            }
        }
    希望有所帮助。
    2011年12月15日 8:11
    版主
  • 你好,

     谢谢你的回答,  你说的这种方法 我知道,

    可是我要实现的功能是: 可以改变列的显示顺序 ,但是 数据源类的数据会一直变化。 所以我觉得,DataTemplate不确定要绑定数据源类哪个字段,如果用个GridData类,但是数据源类通知GridData类,再实时更新会不会更麻烦,才想要在后台绑定比较好 ,就不需要多一个 GridData类 。不知道这样想对不对。

    请问 在后台的时候要如何绑定呢。

    2011年12月16日 6:02
  • 你好,

     谢谢你的回答,  你说的这种方法 我知道,

    可是我要实现的功能是: 可以改变列的显示顺序 ,但是 数据源类的数据会一直变化。 所以我觉得,DataTemplate不确定要绑定数据源类哪个字段,如果用个GridData类,但是数据源类通知GridData类,再实时更新会不会更麻烦,才想要在后台绑定比较好 ,就不需要多一个 GridData类 。不知道这样想对不对。

    请问 在后台的时候要如何绑定呢。


    根据你的描述,你可以通过绑定一个中间的字段来不断改变listbox所绑定的数据,你可以试试以下代码。

    .xaml

      <ListBox Name="listBox1"   >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding DisplayField}" x:Name="t1"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    .cs

     public partial class MainPage : PhoneApplicationPage
        {
            private ObservableCollection<GridData> datasource = GridData.GetData();
            public MainPage()
            {
                InitializeComponent();
                listBox1.ItemsSource = datasource;
                DispatcherTimer timer = new DispatcherTimer();
                timer.Tick += new EventHandler(timer_Tick);
                timer.Interval = new TimeSpan(0, 0, 2);
                timer.Start();
    
                DispatcherTimer timer2 = new DispatcherTimer();
                timer.Tick += new EventHandler(timer2_Tick);
                timer.Interval = new TimeSpan(0, 0, 2);
                timer.Start();
            }
    
            void timer_Tick(object sender, EventArgs e)
            {
                foreach (var item in listBox1.Items)
                {
                    var data = item as GridData;
                    if (data.DisplayField == data.LastName)
                        data.DisplayField = data.FirstName;
                    else
                        data.DisplayField = data.LastName;
                }
            }
            void timer2_Tick(object sender, EventArgs e)
            {
                datasource.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "X",
                    LastName = "X"
                });
            }
        }
        public class GridData : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
    
            private string displayField;
            public string DisplayField
            {
                get { return this.displayField; }
                set
                {
                    this.displayField = value;
                    this.NotifyPropertyChanged("DisplayField");
                }
            }
    
            private string firstName;
            public string FirstName
            {
                get { return this.firstName; }
                set
                {
                    this.firstName = value;
                    this.NotifyPropertyChanged("FirstName");
                }
            }
    
            private string lastName;
            public string LastName
            {
                get { return this.lastName; }
                set
                {
                    this.lastName = value;
                    this.NotifyPropertyChanged("LastName");
                }
            }
            public static ObservableCollection<GridData> GetData()
            {
                ObservableCollection<GridData> data = new ObservableCollection<GridData>();
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "John Doe",
                    LastName = "A."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Jane Doe",
                    LastName = "B."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Jason Smith",
                    LastName = "C."
                });
                data.Add(new GridData()
                {
                    DisplayField = string.Empty,
                    FirstName = "Kayli Jayne",
                    LastName = "D."
                });
                return data;
            }
        } 
    2011年12月16日 7:39
    版主