【问题标题】:Populating combobox in datagrid with tooltips WPF使用工具提示 WPF 在数据网格中填充组合框
【发布时间】:2021-06-16 01:42:20
【问题描述】:

目前我正在尝试使用自定义数据结构填充组合框下拉列表,该数据结构包含项目值和用于描述项目的相关工具提示。

只要列表被填充,列表的填充和工具提示都可以正常工作,但是无论何时选择一个项目,绑定都会引用对象而不是对象中的状态值。

我尝试更改组合框的 relativesource 属性,因为我知道它为什么引用对象而不是值(因为组合框的子项能够直接访问值),但我不知道如何修复问题。

简单地说,我试图从 mainwindow.xaml.cs 中的列表填充组合框的下拉值,然后从绑定中获取这些值并将它们重新绑定到 ticketinfo 中的值。

我用来测试的代码如下。

MainWindow.xaml

<DataGrid x:Name="dgData" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Subject}" Header="Subject" Width="*"/>
                <DataGridTemplateColumn Header="Status" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Status}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox Height="22"
                                      IsEditable="True"
                                      ItemsSource="{StaticResource StatusList}"
                                      SelectedItem="{Binding Status}"
                                      IsTextSearchEnabled="True">
                                <ComboBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Status}" ToolTip="{Binding ToolTip}" />
                                    </DataTemplate>
                                </ComboBox.ItemTemplate>
                                </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Binding="{Binding RaisedBy,
                                        Mode=TwoWay,
                                        UpdateSourceTrigger=PropertyChanged}" Header="Raised By" Width="100"/>
            </DataGrid.Columns>
        </DataGrid>

MainWindow.xaml.cs

public class TicketInfo
    {
        public string Subject { get; set; }
        public string Status { get; set; }
        public string RaisedBy { get; set; }
    }

    //Handle Dropdown boxes
    public class StatusList : List<StatusCombo>
    {
        public StatusList()
        {
            this.Add(new StatusCombo("Test", "Test 2"));
            this.Add(new StatusCombo("Check", "Check 2"));
            this.Add(new StatusCombo("Fail", "Fail 2"));
        }
    }
    public class StatusCombo
    {
        public string Status { get; set; }
        public string ToolTip { get; set; }
        public StatusCombo(string s, string t)
        {
            Status = s;
            ToolTip = t;
        }
    }

编辑:为了澄清这里的情况,它并不像直接绑定到 TicketInfo 中的 Status 变量那么简单。每当使用这样的实现时,它都会显示 StatusCombo 的 namespace.classname。

【问题讨论】:

    标签: c# wpf data-binding combobox binding


    【解决方案1】:

    要将所选组合框项的Status 值绑定到TicketInfoStatus 值,您可以使用提供的SelectedValuePath 绑定到SelectedValue。所以在你的情况下,组合框可以定义为

    <ComboBox Height="22"
              IsEditable="True"
              ItemsSource="{StaticResource StatusList}"
              SelectedValue="{Binding Status}" SelectedValuePath="Status"
              IsTextSearchEnabled="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Status}" ToolTip="{Binding ToolTip}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多