2016-06-29 4 views
0

У меня есть две комбинированные коробки: CarTypeComboBox и SeriesComboBox.WPF Combo Box Стиль

Вопросы: 1. Я хочу SeriesCombox быть видимым только тогда, когда пользователь выбирает BMW. 2. System.Windows.Style отображается в SeriesComboBox.

Спасибо

Полный код:

<Window x:Class="StyleTrigger.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:local="clr-namespace:StyleTrigger" 
      xmlns:local2="clr-namespace:ComboBoxData" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="350" Width="525"> 


     <Window.Resources > 
      <local2:ComboBoxItemCollection x:Key="CarItemsCollection"/> 

     </Window.Resources> 

     <Grid> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="50*" /> 
       <ColumnDefinition Width="50*"/> 

      </Grid.ColumnDefinitions> 


      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 



      <StackPanel Grid.Row="1" Grid.Column="0" > 
       <Label x:Name="CarBrand" Height="30" Width="75" Margin="10,0,0,0" Content="Car Brand" 
           HorizontalAlignment="Left" VerticalAlignment="Top"/> 
       <ComboBox x:Name="CarTypeComboBox" Margin="10,0,0,0" Width="100" Height="30" HorizontalAlignment="Left" VerticalAlignment="Top" 
         ItemsSource="{Binding Mode=OneWay, Source={StaticResource CarItemsCollection}}" 
         DisplayMemberPath="CarType" 
         SelectedValuePath="CarID" 
        /> 
      </StackPanel> 


      <StackPanel Grid.Row="1" Grid.Column="1" > 
       <Label x:Name="CarSeries" Height="30" Width="75" Margin="10,0,0,0" Content="Car Series" 
           HorizontalAlignment="Left" VerticalAlignment="Top"/> 


       <ComboBox x:Name="SeriesComboBox" Margin="10,0,0,0" Width="100" Height="30" 
          HorizontalAlignment="Left" VerticalAlignment="Top"> 

        <sys:String>230</sys:String> 
        <sys:String>280</sys:String> 
        <sys:String>530</sys:String> 


        <Style TargetType="ComboBox"> 

         <Setter Property="Visibility" Value="Hidden" /> 

         <Style.Triggers> 
          <DataTrigger Binding="{Binding SelectedItem.CarType, ElementName=CarTypeComboBox}" Value="BMW"> 
           <Setter Property="Visibility" Value="Visible"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </ComboBox> 
      </StackPanel> 




     </Grid> 
    </Window> 

C#

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace ComboBoxData 
     { 
     class SingleComboBoxItem 
      { 
      public SingleComboBoxItem(int pCarID,String pCarBrand) 
       { 
       CarID = pCarID; 
       CarType = pCarBrand; 
       } 

      public string CarType { get; set; } 
      public int CarID { get; set; } 

      } 
     } 


    using System; 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace ComboBoxData 
     { 
     class ComboBoxItemCollection : ObservableCollection<SingleComboBoxItem> 
      { 
      public ComboBoxItemCollection() : base() 
       { 
       Add(new SingleComboBoxItem(1,"Honda")); 
       Add(new SingleComboBoxItem(2,"Toyota")); 
       Add(new SingleComboBoxItem(3,"BMW")); 
       Add(new SingleComboBoxItem(4,"Dodge")); 
       Add(new SingleComboBoxItem(5,"Lexus")); 
       } 

      } 
    } 
+0

Какая у вас проблема? –

+0

SeriesComboBox не появляется, когда я выбираю BMW. – TheOne

+0

Это было бы намного проще, если бы вы вставляли весь XAML для своего ComboBox, вместо того, чтобы рассеивать фрагменты фрагмента, декорированные вокруг вашего вопроса, и ожидали, что мы догадаемся, что происходит в вашем реальном коде. Ответ Х.Б., вероятно, правильный, но я не могу быть уверен. –

ответ

0

Ваш стиль ComboBox должен выглядеть следующим образом:

<Style TargetType="ComboBox"> 
    <!-- Just add this one Setter --> 
    <Setter Property="Visibility" Value="Hidden" /> 

    <Style.Triggers> 
    <DataTrigger Binding="{Binding SelectedItem.CarType, ElementName=CarTypeComboBox}" Value="BMW"> 
     <Setter Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

Не устанавливайте атрибут самого ComboBox тега Visibility. № Visibility="Hidden" на ComboBox. Это будет отменять стилизаторы, и будет видно, что будет видно никогда. ТОЛЬКО набор Visibility в сеттерах в стиле.

UPDATE

Теперь, когда я видел весь код, я могу предложить немного больше понимания. Во-первых, вы сказали: «The SeriesComboBox не появляется, когда я выбираю BMW». Но что происходит в версии, которую вы только что опубликовали, это то, что это не исчезает, когда вы не выберите BMW. Теперь давайте посмотрим на то, что это сделать:

enter image description here

Там аномалия в этом списке: Последний пункт System.Windows.Style. Я готов поспорить, что вы никогда не видели эту модель BMW на дороге больше, чем я.

Ваш Style правильно определен, и я думаю, что это могло быть правильным даже до того, как мы начали вас обманывать. Проблема в том, что вы не назначаете его Style собственности ComboBox. Вместо этого вы добавляете его к свойству содержимого по умолчанию, которое в случае ComboBox равно Items. В WPF вы можете бросить буквально почти фигуративно всего около в коллекции предметов ComboBox (или ListBox). Это коллекция object. Он съест любой старый мусор, который вы его кормите, и никогда не жалуйтесь. Поскольку вы не указали DisplayMemberPath для этого, он просто бодро называет ToString() по каждому объекту в свою очередь.

Так, чтобы назначить стиль для Style собственности ComboBox, положить его в <ComboBox.Style>:

<ComboBox 
    x:Name="SeriesComboBox" 
    Margin="10,0,0,0" 
    Width="100" 
    Height="30" 
    HorizontalAlignment="Left" 
    VerticalAlignment="Top"> 

    <sys:String>230</sys:String> 
    <sys:String>280</sys:String> 
    <sys:String>530</sys:String> 

    <ComboBox.Style> 
     <Style TargetType="ComboBox"> 
      <Setter Property="Visibility" Value="Hidden" /> 

      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding SelectedItem.CarType, ElementName=CarTypeComboBox}" 
        Value="BMW" 
        > 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 

Вы можете также определить Style в Resources, дайте ему x:Key="SeriesComboBoxStyle" и установить атрибут Style на ComboBox тег: Style="{StaticResource SeriesComboBoxStyle}".

+0

Поверьте мне, это то, что я сделал, и это не сработало. – TheOne

+0

@NewUser Я тебе не доверяю; вы продолжаете менять свою историю о том, что находится в вашем XAML. Возможно, вы устанавливаете видимость в attriubute. Возможно, выбранный элемент в 'CarTypeComboBox' не имеет свойства CarType, или он никогда не равен« BMW », или« CarTypeComboBox »на самом деле не является именем этого ComboBox. Вы не публиковали ничего, что воспроизводит проблему, поэтому никто не может вам помочь. –

+0

Завтра я отправлю код, который у меня есть. – TheOne

1

Добавить дополнительный Setter со значением по умолчанию Hiddenк самому Style, а не Триггеры.

+0

Я добавил <Свойство Setter = «Видимость» Значение = «Скрытый» /> для стиля по-прежнему не работает, – TheOne

+0

Используйте свой мозг, триггер должен установить его на «Видимый». –

+0

Это то, что вы рекомендовали в своем комментарии. – TheOne