首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGrid DataGridTemplateColumn

WPF DataGrid DataGridTemplateColumn
EN

Stack Overflow用户
提问于 2014-04-26 11:26:30
回答 1查看 850关注 0票数 0

我想展示一个人的名字和性别。用户应该能够输入名称并从组合框中选择性别。我希望combobox始终都是可见的,所以我使用DataGridTemplateColumn。然而,每当我添加新的人名单,性不是显示在组合框,但我确定它是设置的。但是,如果我从组合框中选择了任何内容,就会显示所选内容,并更新有关模型的数据。有什么可以让这件事成功的吗?注意:我用的是卡利伯恩。

这是我的观点:

代码语言:javascript
复制
<Window x:Class="WpfPetApp.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <DataGrid x:Name="TestDataGrid" Grid.Row="0" ColumnWidth="*" HeadersVisibility="Column" SelectedItem="{Binding SelectedTestDataGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        CanUserDeleteRows="False" 
                        CanUserAddRows="False" 
                        CanUserResizeColumns="False"
                        CanUserReorderColumns="False"
                        CanUserResizeRows="False"
                        CanUserSortColumns="True"
                        AutoGenerateColumns="False" 
                        SelectionMode="Single" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding ElementName=TestDataGrid, Path=DataContext.Sexes}" SelectedValue="{Binding Sex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="AddRow" Grid.Row="1">Add</Button>
    </Grid>
</Window>

ViewModel:

代码语言:javascript
复制
public class ShellViewModel : PropertyChangedBase, IShell
{
    private Person _selectedTestDataGrid;

    public ObservableCollection<Person> TestDataGrid { get; set; }
    public ObservableCollection<Sex> Sexes { get; set; }

    public Person SelectedTestDataGrid
    {
        get { return _selectedTestDataGrid; }
        set
        {
            if (Equals(value, _selectedTestDataGrid)) return;
            _selectedTestDataGrid = value;
            NotifyOfPropertyChange(() => SelectedTestDataGrid);
        }
    }

    public ShellViewModel()
    {
        TestDataGrid = new ObservableCollection<Person>();
        Sexes = new ObservableCollection<Sex>();

        Sexes.Add(Sex.Male);
        Sexes.Add(Sex.Female);
    }

    public void AddRow()
    {
        var rnd = new Random(DateTime.Now.Millisecond);
        var male = rnd.Next() % 2 == 0;
        TestDataGrid.Add(new Person { Name = Guid.NewGuid().ToString(), Sex = (male ? Sex.Male : Sex.Female) });
    }
}

和模型:

代码语言:javascript
复制
public class Person
{
    public string Name { get; set; }
    public Sex Sex { get; set; }
}

public class Sex
{
    public static readonly Guid MaleSexId = new Guid("9BF621E2-98FC-45FB-A4AC-4A930AD95CF7");
    public static readonly Guid FemaleSexId = new Guid("425B1B2A-B47D-4C25-A5AF-D3A0ABC95A75");

    public static Sex Male
    {
        get
        {

            return new Sex(MaleSexId);
        }
    }

    public static Sex Female
    {
        get
        {
            return new Sex(FemaleSexId);
        }
    }

    private readonly Guid _sexId;

    public Sex(Guid sexId)
    {
        _sexId = sexId;
    }

    public Guid Value
    {
        get { return _sexId; }
    }

    public override string ToString()
    {
        return _sexId == MaleSexId ? "male" : _sexId == FemaleSexId ? "female" : "unknown";
    }
}

和一个应用程序的屏幕:22-.png

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-26 12:29:33

在添加行时没有选择任何项,因为ItemsSourceSelectedValue引用的是完全不同的实例

我不知道为什么每次访问Sex.MaleSex.Female时总是返回新实例。因此,当设置ItemsSource时,添加新的男性和女性实例,添加行时,返回ItemSource中不存在的新的男性/女性实例,因此没有选择任何项。

或者在ComboBox中设置为已经添加的实例,如下所示:

代码语言:javascript
复制
TestDataGrid.Add(new Person { Name = Guid.NewGuid().ToString(),
                              Sex = (male ? Sexes.First() : Sexes.Last()) });

始终从男性/女性返回相同的实例:

代码语言:javascript
复制
public class Sex
{
    private static Sex male = new Sex(MaleSexId);
    public static Sex Male
    {
        get
        {

            return male;
        }
    }

    private static Sex female = new Sex(FemaleSexId);
    public static Sex Female
    {
        get
        {
            return female;
        }
    }

    .....
}

理想情况下,Sex应该是Enum,不需要它有一个类。

代码语言:javascript
复制
public enum Sex
{
   Male,
   Female
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23310173

复制
相关文章

相似问题

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