2010-10-26 4 views
1

Как условно привязывать данные к комбинированному ящику? У меня есть поле со списком, которое по умолчанию должно отображать ID. Однако, если пользователь проверяет флажок, на дисплее должен отображаться как идентификатор, так и имя пользователя. Например, «OO1: Сэм». Я правильно показываю идентификатор по умолчанию. Я просто не уверен, как получить и ID, и NAME для отображения на основе состояния «IsChecked» этого флажка.Как вы условно связываете данные?

WPF и C# .Net 3.5

+0

Yo, на каком языке? –

+0

Извлечь список значений для клиента/или массива. При добавлении элементов в раскрывающийся список добавьте элементы в список, выполняющий правильную манипуляцию строки в списке. – brumScouse

ответ

3

Вот один из способов, с помощью стиля на ComboBox с триггерами, чтобы установить ItemTemplate динамически:

Edit: Изменение стиля в ресурс. Обратите внимание, что это все еще привязано к CheckBox напрямую, используя привязку элемента - если вы хотите, чтобы он был более гибким, вы могли привязать свойство IsChecked CheckBox к свойству ViewModel и полагаться на это изменение, а не на IsChecked.

Давайте двигаться стиль в разделе Ресурсы нашего окна:

<Window.Resources> 
    <Style x:Key="myStyle" TargetType="ComboBox"> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 

     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsChecked,ElementName=chk}" Value="True"> 
       <Setter Property="ItemTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding ID}" /> 
           <TextBlock Text=": " /> 
           <TextBlock Text="{Binding Name}" /> 
          </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

Теперь определим CheckBox и пару ComboBoxes, которые полагаются на него:

<CheckBox x:Name="chk" Content="Click Me" /> 

<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" /> 

<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" /> 
+0

Мэтт, спасибо вам большое! Это именно то, что я искал. Конечно, я уверен, что вы можете сказать, что я новичок в WPF. Я знал, что это должно быть намного проще, чем то, как я это делал. Теперь, есть ли способ сделать это «StaticResource», не уверен, что это правильный термин. И как бы вы использовали его в определении со списком? – GAR8

+0

Планируете ли вы повторно использовать стиль для нескольких ComboBox, GAR8? Я мог бы отредактировать ответ и поменять его на ресурс, если хотите - это не большое изменение. Если вы не используете его повторно в нескольких ComboBox, это не стоит делать его ресурсом IMHO. –

+0

Да, Мэт, есть два комбинированных блока, на которые будет воздействовать это отдельное состояние флажка, а также некоторые данные, содержащиеся в DataGrid. Я также буду использовать эту же концепцию в другом флажке, который будет влиять на три поля со списком текстового поля и данных в том же DataGrid. Поэтому иметь ресурс для минимизации и повторного использования кода будет очень полезным. Большое вам спасибо за помощь в этом. G – GAR8

1

Я бы сделать это в ViewModel. У вас может быть viewmodel для ваших элементов со списком, другой для любого экрана, на котором установлен флажок, и каким-то образом для опции viewmodel checkbox указывать модели представления элементов, когда его значение изменилось. Затем в viewmodel item есть условная логика в свойстве Text (или как вы это называете) и реализует обычный шаблон INotifyPropertyChanged, чтобы уведомить пользовательский интерфейс, когда его текст изменился.

Выгода: таким образом вы можете написать модульные тесты для этого поведения. (И если это стоит вставить, стоит написать модульные тесты для.)

Смежные вопросы