WPF 如何设置具有不同项源的列表视图中绑定组合框的选定项

本文关键字:视图 列表 绑定 组合 何设置 设置 WPF | 更新日期: 2023-09-27 18:32:51

嗨,我在ListView

项目上有一个ComboBox,ComboBox使用一个ObservableCollection,ListView使用另一个。如何将组合框的选定项设置为列表视图项中列的值?

列表视图使用如下所示定义的网格视图:

        <GridView x:Key="manage_calls_gridView">
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding MCName}" />
        <GridViewColumn Header="Allocated To" DisplayMemberBinding="{Binding MCPostCode}" />
        <GridViewColumn Header="Post Code" Width="180" CellTemplate="{StaticResource manage_calls_pcode}" />
    </GridView>

在数据模板中定义组合框,如下所示:

        <DataTemplate x:Key="manage_calls_pcode">
        <ComboBox Width="180" DropDownClosed="mc_pcode_DropDownClosed" DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" 
                  ItemsSource="{Binding Path=LookUpCollection_6}" 
                  DisplayMemberPath="Desc"
                  />
    </DataTemplate>

这是 ComboBox 用于其 ObservableCollection (LookUpCollection_6) 的类。

        public class LookUp
    {
        public string Id { get; set; }
        public string Desc { get; set; }
    }

这是包含 ComboBox 的 ListView 用于其 ObservableCollection (SalesAgentList) 的类。

        public class SalesAgentRec
    {
        public string MCName { get; set; }
        public string MCPostCode { get; set; }
        public string MCSource { get; set; }
        public string MCUid { get; set; }
        public string MCRecs { get; set; }
    }

我需要将组合框的选定项目/值设置为 MCPostCode 的值。

提前感谢,

史蒂夫。

WPF 如何设置具有不同项源的列表视图中绑定组合框的选定项

在你的类/数据模型中
做并删除数据上下文

public class SalesAgentRec
    {
        public string MCName { get; set; }
        public string MCPostCode { get; set; }
        public string MCSource { get; set; }
        public string MCUid { get; set; }
        public string MCRecs { get; set; }
        public List<LookUpCollection_6> { get; set; }
    }

SelecteIndex="{Binding Path=MCPostCode}"

对于像这样的简单ID Desc,请使用字典。 这两个属性是"键"和"值"。

有什么

理由为什么这不起作用吗?

  <DataTemplate x:Key="manage_calls_pcode">
    <ComboBox Width="180" DropDownClosed="mc_pcode_DropDownClosed"
      ItemsSource="{Binding DataContext.LookUpCollection_6 ,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"
      SelectedItem="{Binding MCPostCode}" 
      DisplayMemberPath="Desc" />
</DataTemplate>

现在直接设置 ItemsSoruce,允许您访问行的"MCPostCode"值,而不是将 ComboBox.DataContext 设置为父 ListView。除非我错过了什么?

这是对我有用的最终解决方案。

组合框的更改数据模板:

        <DataTemplate x:Key="manage_calls_pcode">
        <ComboBox Width="90" SelectedIndex="{Binding Path=MCPostCodeX}" DropDownClosed="mc_pcode_DropDownClosed" 
                  ItemsSource="{Binding Path=MCCodes}" 
                  DisplayMemberPath="Value" 
                  Tag="{Binding Path=MCSIndex}"
                  />
    </DataTemplate>

对组合框的 ItemSource 使用字典的更改:

public Dictionary<int, string> PCodeList = new Dictionary<int,string>();

用于加载字典的方法

        ArrayList lkl = serl.ListLookupsC(0);
        if (lkl.Count > 1)
        {
            LookUpCollection_6.Clear();
            LookUpCollection_7.Clear();
            for (int x = 0; x < lkl.Count; x++)
            {
                string[] strLData = (string[])lkl[x];
                PCodeList.Add(x, strLData[1]);
            }
        }

对 SalesAgentRec 类的更改

        public class SalesAgentRec
    {
        public string MCName { get; set; }
        public string MCPostCode { get; set; }
        public string MCSource { get; set; }
        public string MCUid { get; set; }
        public string MCRecs { get; set; }
        public Dictionary<int, string> MCCodes { get; set; }
        public int MCPostCodeX { get; set; }
        public string MCSIndex { get; set; }
    }

加载销售代理列表集合的方法

    private void GetSalesAgents()
    {
        this.Cursor = Cursors.Wait;
        SerUsers seru = new SerUsers();
        ArrayList al = seru.GetTeleSales();
        _SalesAgentList.Clear();
        if (al.Count == 0)
        {
            this.Cursor = Cursors.Arrow;
            return;
        }
        for (int x = 0; x < al.Count; x++)
        {
            string[] strData = (string[])al[x];
            int nIndex = -1;
            // Use LINQ to find the key for the value
            if (strData[2].Length == 2)
            {
                var item = (from d in PCodeList
                            where d.Value.Substring(0, 2) == strData[2]
                            select d.Key).FirstOrDefault();
                nIndex = (int)item;
            }
            _SalesAgentList.Add(new SalesAgentRec{
                MCUid = strData[0],
                MCName = strData[1],
                MCPostCode = strData[2],
                MCCodes = PCodeList,
                MCPostCodeX = nIndex,
                MCSIndex = x.ToString()
            });
        }
        this.manage_calls_listView.View = this.manage_calls_listView.FindResource("manage_calls_gridView") as ViewBase;
        this.Cursor = Cursors.Arrow;
    }

上面的代码尚未针对性能或错误处理进行优化,纯粹用于测试提供的答案。serl 返回的值。ListLookupC(0) 由于该方法中 SQL 查询的性质,它将是唯一的。

再次感谢所有花时间回复的人。