2015-03-31 149 views
0

我知道已經有很多相似的事情的例子,我已經閱讀了這些,但無法弄清楚爲什麼我的實現不起作用。WPF啓用基於另一個組合框的組合框

我試圖在ComboBoxA設置爲值X時禁用ComboBoxB。在此實現中,無論在ComboBoxA中選擇了哪個值,都始終啓用ComboBoxB。

ComboBoxA:

<ComboBox Name="ComboBoxA"> 
    <ComboBoxItem Name="X">X</ComboBoxItem> 
    <ComboBoxItem Name="Y">Y</ComboBoxItem> 
</ComboBox> 

ComboBoxB:

<ComboBox Name="ComboBoxB"> 
    <ComboBoxItem Name="Something">Something</ComboBoxItem> 
    <ComboBox.Style> 
     <Style TargetType="{x:Type ComboBox}"> 
      <Setter Property="IsEnabled" Value="True" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 

回答

0

你永遠不進行數據綁定ComboboxA。

你引用的ElementName 「ComboboxA」 而不是 「ComboboxB」

您有:

<DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxB}" Value="X"> 

這應該是:

<DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X"> 

<ComboBox Name="ComboBoxB"> 
    <ComboBoxItem Name="Something">Something</ComboBoxItem> 
    <ComboBox.Style> 
     <Style TargetType="{x:Type ComboBox}"> 
      <Setter Property="IsEnabled" Value="True" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 
+0

道歉,當我簡化問題中使用的名稱時,這是一個錯字。我真正的ComboBoxB綁定到ComboBoxA。 (我更新了這個例子),但這不適合我。有任何想法嗎? – Scotty 2015-03-31 02:00:31

+0

在您的輸出窗口中,您是否觀察到任何綁定錯誤? – 2015-03-31 02:03:15

+0

輸出中沒有錯誤或錯誤列表。如果在我發佈的簡單示例中沒有可見的錯誤,我可以用我的實際代碼更新該問題。 – Scotty 2015-03-31 04:46:12

0

您可以使用轉換器來做到這一點。

public class SelectedItemToDisable : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 

     if (value != null) 
     { 
      var val = (value as ComboBoxItem).Content; 
      if (val.ToString() == "X") //may be its not string, some object type 
       return false; 
     } 
     return true; 
    } 

在Xaml的資源部分定義轉換器。

<local:SelectedItemToDisable x:Key="DisableConverter"/> 

<ComboBox Name="ComboBoxA"> 
<ComboBoxItem Name="X">X</ComboBoxItem> 
<ComboBoxItem Name="Y">Y</ComboBoxItem> 
</ComboBox> 
<ComboBox Name="ComboBoxB" IsEnabled="{Binding Path=SelectedItem, ElementName=ComboBoxA, Converter={StaticResource DisableConverter}}"> 
<ComboBoxItem Name="Something">Something</ComboBoxItem> 
</ComboBox> 

希望這會有所幫助。