我将组合框与另一个组合框绑定有问题。我正在尝试动态地将参数(id)从第一个组合框传递到启动第二个组合框的方法。例如,如果我在第一个组合框中选择了第一个项目,那么第二个组合框将使用从第一个组合框中选择的参数进行初始化。
XAML:
<ComboBox Name="ItServiceCmbox" ItemsSource="{Binding ItServiceMetricsNames}" DisplayMemberPath="ServiceName" SelectedValuePath="ServiceId" />
<ComboBox Name="MetricCmbox" ItemsSource="{Binding SelectedItem.MetricId, ElementName=ItServiceCmbox}" DisplayMemberPath="MetricName" SelectedValuePath="MetricId"/>
C#:
public partial class MainWindow : Window
{
readonly MetricsValuesHelper _metricsValuesHelper = new MetricsValuesHelper(new Repository());
public static int SelectedService;
public static int SelectedMetric;
public ObservableCollection<ItServiceMetricsNames> ItServiceMetricsNames { get; set; }
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
SelectedService = Convert.ToInt32(ItServiceCmbox.SelectedItem);
ItServiceMetricsNames = new ObservableCollection<ItServiceMetricsNames>();
ItServiceMetricsNames.Add(new ItServiceMetricsNames()
{
ServiceId = _metricsValuesHelper.GetServiceId(),
ServiceName = _metricsValuesHelper.GetServiceName(),
MetricId = _metricsValuesHelper.GetMetricId(SelectedService),
MetricName = _metricsValuesHelper.GetMetricName(SelectedService)
});
}
}
ItServiceMetricsNames类:
public class ItServiceMetricsNames
{
public List<int> ServiceId { get; set; }
public List<string> ServiceName { get; set; }
public List<int> MetricId { get; set; }
public List<string> MetricName { get; set; }
}
有可能吗?谢谢你的回答!
答案 0 :(得分:1)
这是我去年做的一个混乱,天真的实现似乎有效。绝对有更好的方式。而不是尝试在我的xaml中做任何实际绑定,我做了事件处理程序。您可以为ComboBox创建事件处理程序,只要发送ComboBox失去焦点,关闭它的DropDown,更改选择等,就会触发它们。
如果您希望一个ComboBox依赖于另一个,则可以禁用相关的ComboBox,直到在独立的ComboBox中进行选择。完成选择后,您将使用适当的数据填充并启用相关的ComboBox。
代码中的事件处理程序将如下所示:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Independent ComboBox is the sender here
ProcessComboBoxes(sender as ComboBox);
}
ProcessComboBoxes方法看起来会有所不同,具体取决于您要执行的操作。但是,基本上,它将识别您想要有条件地填充的目标/依赖ComboBox - 使用从ComboBox映射到ComboBox的字典或您认为合适的字符来执行此操作。确定目标后,您将清除之前添加的任何项目,然后重新填充新项目。以下是伪代码(实际上)的方法。
private void ProcessComboBoxes(ComboBox senderBox)
{
ComboBox dependentBox = lookupDependent[senderBox];
var itemType = itemTypes[senderBox.selectedIndex];
var listOfItemsNeeded = lookupItemsByType[itemType];
dependentBox.Items.Clear();
foreach (string item in listOfItemsNeeded){
dependentBox.Items.Add(item);
}
dependentBox.IsEnabled = true;
}
不要忘记将您的事件处理程序添加到您的xaml中。确保密切关注事件的调用层次结构,并确定何时需要重新填充依赖的ComboBox。