XAML防止选择组合框的某些值

时间:2016-08-30 21:37:44

标签: c# wpf xaml combobox

我要求用户无法选择某些组合框的值,当在第一个ComboBox中选择特定值时,我有两个这样的组合框:

<ComboBox x:Name="jobTypeComboBox"      SelectionChanged="ComboBox_SelectionChanged" Margin="10,66,209,461" IsSynchronizedWithCurrentItem="False" AllowDrop="True" PlaceholderText="job type" Background="Black" Foreground="#FFFDFDFD">
        <x:String>Repair</x:String>
        <x:String>Replace</x:String>
        <x:String>Special</x:String>
        <x:String>Commercial</x:String>
        <x:String>Plexi</x:String>
        <x:String>Other</x:String>
</ComboBox>
<ComboBox x:Name="glassTypeComboBox" SelectionChanged="ComboBox_SelectionChanged" Margin="10,109,209,410" IsSynchronizedWithCurrentItem="False" AllowDrop="True" PlaceholderText="glass type" Background="Black">
        <x:String>Windscreen</x:String>
        <x:String>Rearscreen</x:String>
        <x:String>Side Glass</x:String>
        <x:String>Mirror</x:String>
        <x:String>Building Glass</x:String>
        <x:String>Other</x:String>
</ComboBox>

如果我选择修复&#39;在第一个组合框上,第二个组合框不能包含挡风玻璃以外的任何值。或者&#39;后屏幕&#39;我是XAML的新手并不确定我会以何种方式拒绝用户在此组合框中选择某些值

编辑:

  private void jobTypeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (var glassType in glassTypeComboBox.Items)
        {
            ComboBoxItem cbi = glassType as ComboBoxItem;
            cbi.IsEnabled = true; // always default to enabled.
            if (jobTypeComboBox.SelectedValue.ToString() == "Repair")
            {
                if ((cbi.Content.ToString() != "Windscreen") && (cbi.Content.ToString() != "Rearscreen"))
                {
                    cbi.IsEnabled = false;
                }

            }
            if (jobTypeComboBox.SelectedValue.ToString() == "Replace")
            {
                //More conditions here
            }
        }
    }

我正在使用什么来尝试删除/禁用我不想要的值(感谢Lynn Crumbling)的想法/帮助!只是不能让它在这里读取if条件:

if (jobTypeComboBox.SelectedValue.ToString() == "Repair")

我也尝试过:

if (this.jobTypeComboBox.SelectedValue.ToString() == "Repair")

和林恩的初步建议,有很多例子。

即使选择了它,它也会在调试期间跳过它。任何额外的建议都会很棒!

2 个答案:

答案 0 :(得分:1)

如果您将组合框中的条目更改为实际的ComboBoxItem控件:

<ComboBox x:Name="jobTypeComboBox"  
        SelectionChanged="jobTypeComboBox_SelectionChanged" ...more stuff...>
    <sys:String>Repair</sys:String>
    <sys:String>Replace</sys:String>
    <sys:String>Special</sys:String>
    <sys:String>Commercial</sys:String>
    <sys:String>Plexi</sys:String>
    <sys:String>Other</sys:String>
</ComboBox>
<ComboBox x:Name="glassTypeComboBox" 
      SelectionChanged="glassTypeComboBox_SelectionChanged"  ...more stuff...>
    <ComboBoxItem>Windscreen</ComboBoxItem>
    <ComboBoxItem>Rearscreen</ComboBoxItem>
    <ComboBoxItem>Side Glass</ComboBoxItem>
    <ComboBoxItem>Mirror</ComboBoxItem>
    <ComboBoxItem>Building Glass</ComboBoxItem>
    <ComboBoxItem>Other</ComboBoxItem>
</ComboBox>

您可以连接jobTypeComboBox_SelectionChanged事件以修改您选择的已启用ComboBoxItem:

private void jobTypeComboBox_SelectionChanged(object sender, 
           System.Windows.Controls.SelectionChangedEventArgs e)
{
    foreach (var glassType in this.glassTypeComboBox.Items)
    {
        ComboBoxItem cbi = glassType as ComboBoxItem;
        cbi.IsEnabled = true; // always default to enabled.
        if (this.jobTypeComboBox.SelectedValue.ToString() == "Repair")
        {
            if ((cbi.Content.ToString() != "Windscreen") && 
                       (cbi.Content.ToString() != "Rearscreen"))
            {
                cbi.IsEnabled = false;
            }
        }
        if (this.jobTypeComboBox.SelectedValue.ToString() == "Replace")
        {
            // Add more conditions... you get the idea...
        }
    }
}

这只是一个小片段,专门用来禁用这些项目。你可能想要更多的条件。

旁注:曾经考虑过使用MVVM方法和数据绑定吗?它太强大了。

答案 1 :(得分:0)

尝试从ComboBox中删除项目,如果作业类型发生更改,请不要忘记保存所有jobTypeComboBox项目以恢复它们。这只是一个想法。根据需要进行专业化。

 if (jobTypeComboBox.Text == "Repair")
       for (int i = 2; i < jobTypeComboBox.Items.Count; i++)
          glassTypeComboBox.RemoveAt(i);