这是我之前关于 C# WPF 解决方案中的 ComboBox
的问题的后续内容。 背景:我有两个班级:
Pallet
和
CUnit
。我有一个
Pallet
对象列表,称为
ActivePallets
和一个
CUnit
,称为
Unit
。我有以下来源(在 XAML 中):
<ComboBox x:Name="Cmb_MPNr"
ItemsSource="{Binding ActivePallets}"
SelectedValue="{Binding Unit.MPNr, Mode=TwoWay}"
SelectedValuePath="MPNr"
IsTextSearchEnabled="True"
TextSearch.TextPath="MPNr"
IsEditable="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding MPNr}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBox Name="PO" Grid.Row="0" Grid.Column="2" IsEnabled="False">
<TextBox.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="SelectedItem.PO" ElementName="Cmb_MPNr" />
<Binding Path="SelectedItem.Description" ElementName = "Cmb_MPNr" />
</MultiBinding>
</TextBox.Text>
</TextBox>
我(或多或少)明白这意味着什么:ComboBox
的来源是
ActivePallets
,当选择一个
MPNr
(在
ComboBox
中)时,会找到对应的
CUnit
,并且它的
PO
和
Description
显示在
TextBox
中。我遇到的问题是,
Pallet
不是由其
MPNr
唯一定义的,而是由
MPNr
和
PO
的组合定义的。我最初的问题被作为重复项关闭,因为我不明白
SelectedItem
不是关键属性(它是
SelectedValue
和
SelectedValuePath
的组合,但现在我仍然是
的问题) MPNr
和PO
将用作输入参数,我不知道该怎么做。
供您参考,在
Pallet
和 CUnit
类中,MPNr
和 PO
的定义方式非常简单:
public int MPNr { get; set; }
public int PO { get; set; }
最重要的是,
Pallet
和CUnit
类甚至没有显式构造函数。
我需要如何修改
Pallet
和/或CUnit
的定义,以便能够同时使用MPNr
和PO
作为识别的输入参数?
我已经看过这个类似的问题,但我不明白如何在我的情况下应用。
我创建了一个解决方法,创建一个新属性,由两个属性的串联组成:
public string MPNrPO { ...}
...
MPNrPO = $"{MPNr}|{PO}";
这不是一个真正的解决方案:我没有理解如何使用两个参数作为输入参数,而是将它们组合成一个参数并使用该参数,但它完成了工作。
关于解决方法的一个非常重要但非常丑陋的评论:
public string MPNrPO {
get
{
return _mPNrPO;
}
set
{
if (value != null)
_mPNrPO = value;
else
{ } // Sometimes MPNrPO gets set to null
// (the callstack is meaningless,
// root cause is lack of MVVM knowledge)
}
}