WPF ComboBox在更新后显示ModelName而不是值

时间:2014-11-07 06:07:48

标签: c# .net wpf xaml

我正在约束的模型

namespace Project.Telematics_Plugin
{
    public class TelematicsEvent
    {
        public int  EventId { get;set; }

        public String MethodName { get; set; }

        public String Keyword { get;set; }

        public String Opcode { get;set; }

        public String Task { get;set; }

    }

    public class TelematicsKeyword
    {
        public string Keyword { get; set; }
    }

    public class TelematicsTask
    {
        public string Task { get;set; }
    }

    public class TelematicsOpcode
    {
        public string Opcode { get;set; }
    }
}

XAML:

<DataGrid Name="dgMethods" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Event Id" Width="70" Binding="{Binding EventId}" />
        <DataGridTextColumn Header="Event Name" Width="300" Binding="{Binding MethodName}" />
        <DataGridTextColumn Header="Keywords" Width="200" Binding="{Binding Keyword}" />
        <DataGridTextColumn Header="Opcodes" Width="200" Binding="{Binding Opcode}" />
        <DataGridTemplateColumn Header="Tasks" MinWidth="300">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Task}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
                                SelectedValuePath="{Binding Path=Task}"
                                DisplayMemberPath="Task" SelectedItem="{Binding Path=Task, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

当我运行如上所示的代码并尝试从下拉列表中编辑某些列时,如下所示 enter image description here

选择下拉列表后,它会显示返回的模型名称,其中包含网格中的完整命名空间,而不是组合框所选项目的值。 enter image description here

我没有使用MVVM,只是用WinForm风格编写代码。 这是我的代码xaml.cs背后的代码

public AddInScreen()
{
    InitializeComponent();
    Tasks = new List<TelematicsTask>();
    Keywords = new List<TelematicsKeyword>();
    Opcodes = new List<TelematicsOpcode>();
    Events = new List<TelematicsEvent>();


    Tasks.Add(new TelematicsTask() { Task = "ApplicationStarted" });
    Tasks.Add(new TelematicsTask() { Task = "ApplicationClosed" });
    Tasks.Add(new TelematicsTask() { Task = "ApplicationError" });


    Keywords.Add(new TelematicsKeyword() { Keyword = "Application" });
    Keywords.Add(new TelematicsKeyword() { Keyword = "DataAccess" });
    Keywords.Add(new TelematicsKeyword() { Keyword = "UserInterface" });
    Keywords.Add(new TelematicsKeyword() { Keyword = "Session" });

    Opcodes.Add(new TelematicsOpcode() { Opcode = "Start" });
    Opcodes.Add(new TelematicsOpcode() { Opcode = "Finish" });
    Opcodes.Add(new TelematicsOpcode() { Opcode = "Error" });
    Opcodes.Add(new TelematicsOpcode() { Opcode = "Closed" });

    Events.Add(new TelematicsEvent() { EventId = 100, MethodName = "ApplicationStarted", Task= "ApplicationStarted", Keyword = "Application", Opcode = "Start" });
    Events.Add(new TelematicsEvent() { EventId = 100, MethodName = "ApplicationClosed",Task= "ApplicationClosed", Keyword = "Application", Opcode = "Closed" });
    Events.Add(new TelematicsEvent() { EventId = 100, MethodName = "ApplicationError",Task= "ApplicationError", Keyword = "Application", Opcode = "Error" });

    grdTasks.Items.Clear();
    grdKeywords.Items.Clear();
    grdOpcodes.Items.Clear();

    grdTasks.ItemsSource = Tasks;
    grdOpcodes.ItemsSource = Opcodes;
    grdKeywords.ItemsSource = Keywords;
    dgMethods.ItemsSource = Events;

    this.DataContext = Tasks;
}

1 个答案:

答案 0 :(得分:0)

这里的问题是

SelectedItem="{Binding Path=Task, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

您的TelematicsTask课程中没有TelematicsEvent类型的媒体资源。组合框中的项目类型为TelematicsTask,当您将所选项目TelematicsTask实例绑定到字符串时,它会通过调用ToString()来设置值。删除SelectedItem绑定,就可以了。