首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridComboBoxColumn绑定故障

DataGridComboBoxColumn绑定故障
EN

Stack Overflow用户
提问于 2017-03-23 13:55:26
回答 2查看 33关注 0票数 0

如何让DataGridComboBoxColumn显示用户电话号码(现在它显示一个空白的组合框)?

编辑:下面的代码已经更新,现在可以工作了.

代码语言:javascript
复制
<Window x:Class="DataGridTest.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:DataGridTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid   
                    x:Name="myDataGrid"
                    Grid.Row="1"
                    AutoGenerateColumns="False"
                    CanUserAddRows="True"
                    ItemsSource="{Binding PersonList}"
            >

            <DataGrid.Columns>
                <DataGridTextColumn  
                                        Header="LastName"                           
                                        Binding="{Binding LastName}"/>
                <DataGridTextColumn 
                                        Header="FirstName"                          
                                        Binding="{Binding FirstName}" />

                  <DataGridComboBoxColumn 
                                    Header="Phone Number"       

                >
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding PhoneNumbers}" />
                        <Setter Property="SelectedValue" Value="{Binding SelectedPhoneNumber}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding PhoneNumbers}" />
                        <Setter Property="SelectedValue" Value="{Binding SelectedPhoneNumber}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>

            </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>


    </Grid>
</Window>

//代码后面

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

        public ObservableCollection<Person> PersonList { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;

            PersonList = new ObservableCollection<Person>();

            Person jjim = new Person() { FirstName = "jimmy", LastName = "jim" };

            jjim.PhoneNumbers.Add("123-4567");
            jjim.PhoneNumbers.Add("234-5678");

            Person mmark = new Person() { FirstName = "mike", LastName = "mark" };

            mmark.PhoneNumbers.Add("345-6789");
            mmark.PhoneNumbers.Add("456-7890");

            PersonList.Add(jjim);
            PersonList.Add(mmark);
        }


    }

    public class Person : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public ObservableCollection<string> PhoneNumbers { get; set; }



    private string selectedPhoneNumber; 
    public string SelectedPhoneNumber
    {
        get
        {
            return this.selectedPhoneNumber; 
        }

        set
        {
            this.selectedPhoneNumber = value;
            RaisePropertyChanged("SelectedPhoneNumber");
        }
    }


        public Person()
        {
            PhoneNumbers = new ObservableCollection<string>(); 
        }

        private void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private string firstName;
        private string lastName;

        public string FirstName
        {
            get
            {
                return this.firstName;
            }

            set
            {
                this.firstName = value;
                RaisePropertyChanged("FirstName");
            }
        }

        public string LastName
        {
            get
            {
                return this.lastName;
            }

            set
            {
                this.lastName = value;
                RaisePropertyChanged("LastName");
            }
        }
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-23 15:42:29

DataGridColumn不是可视元素,也没有DataContext,因此绑定无法工作。您可以通过为ElementStyleEditingElementStyleDataGridComboBoxColumn指定一个DataGridComboBoxColumnEditingElementStyle来轻松地修复这个问题。

代码语言:javascript
复制
<DataGridComboBoxColumn Header="Phone Number">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding PhoneNumbers}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding PhoneNumbers}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

这是因为实际的ComboBox元素最终会被DataGridComboBoxColumn添加到可视树中,并且样式总是有一个DataContext

有关如何在WPF中绑定到ComboBox的更多示例,请参阅以下链接:https://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82#content

票数 1
EN

Stack Overflow用户

发布于 2017-03-23 13:57:29

看看我对这个问题的回答:DataGridComboBoxColumn is empty似乎是同样的问题。DataGridComboBoxColumn有一点小问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42978144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档