【问题标题】:WPF ComboBox Showing ModelName rather than value after updatingWPF ComboBox在更新后显示ModelName而不是值
【发布时间】:2014-11-07 06:07:48
【问题描述】:

我正在绑定的模型

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>

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

选择下拉列表的值后,它会在网格中显示带有完整命名空间的模型名称,而不是组合框所选项目的值。

我没有使用 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;
}

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    这里的问题是

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

    您的TelematicsEvent 类中没有TelematicsTask 类型的属性。组合框中的项目类型为TelematicsTask,当您将选定项目(即TelematicsTask 实例)绑定到字符串时,它通过调用ToString() 来设置值。去掉SelectedItem绑定就好了。

    【讨论】:

    • 删除 SelectedItem 绑定后,现在当我手动更新下拉选定项目时,它不会在 DataGridCell 上更新。使用选定的 ComboBox 值更新 TextBlock 模板的最佳方法是什么。
    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多