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 的值。
提前感谢,
史蒂夫。
在你的类/数据模型中
做并删除数据上下文
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 查询的性质,它将是唯一的。
再次感谢所有花时间回复的人。