2016-07-24 3 views
0

Мое приложение показывает UserControl для добавления нового объекта. Как только объект был добавлен, он показывает атрибуты созданного объекта.Переключение между состояниями в UserControls

Состояние 1: Empty UserControl
Empty UserInput

Государственный 2: Заполненный UserControl
Filled UserInput

Я понял, что есть 2 способа, я мог бы реализовать что-то вроде этого:

  1. Создать 1 UserControl с двумя различными визуальными состояниями - Переключение между состояниями в зависимости от того, e контролирует экземпляр объекта или нет
  2. Создать 2 UserControls без состояния и показать тот, который в настоящее время необходим. Это требует некоторого механизма более высокого уровня контроля для добавления/удаления правильного элемента управления.

Какова наилучшая практика в таком случае? Каковы преимущества/преимущества одного или другого? Есть ли другие способы, о которых я еще не думал?

ответ

1

Я бы создал два набора данных в UserControl.Resources и заменил их триггером. CreateUserTemplate имеет кнопку, привязанную к CreateUserCommand, или событие click. EditUserTemplate - пользовательский шаблон для редактирования. Content="{Binding}" без пути использует DataContext как Content. Если бы у меня были точные детали вашего вида viewmodel, я мог бы дать вам больше подробностей о том, как вы получаете контент здесь.

Я также предполагаю, что viewmodel имеет свойство NULL UserID.

<ContentControl 
    Content="{Binding}" 
    > 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <!-- Default has to go in a setter in the Style, not an 
       attribute on the ContentControl tag --> 
      <Setter 
       Property="ContentTemplate" 
       Value="{StaticResource EditUserTemplate}" 
       /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding UserID}" Value="{x:Null}"> 
        <Setter 
         Property="ContentTemplate" 
         Value="{StaticResource CreateUserTemplate}" 
         /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

Вы можете написать DataTemplateSelector, но вместо этого для этого тривиального рода вещи, я считаю, это легче сделать все, что в XAML.

1

Для этой конкретной цели WPF предоставляет VisualStateManager.

<UserControl ...> 
    <Grid> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup Name="States"> 
       <VisualState x:Name="WithoutObject"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithoutObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Visible</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Collapsed</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
       <VisualState x:Name="WithObject"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithoutObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Collapsed</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WithObjectPanel" Storyboard.TargetProperty="Visibility"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Visible</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 

     <StackPanel x:Name="WithoutObjectPanel" Visibility="Hidden"> 
      <TextBlock Text="Without object :("/> 
     </StackPanel> 

     <StackPanel x:Name="WithObjectPanel" Visibility="Visible"> 
      <TextBlock Text="With object :) !!!!"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

UserControl.cs

public partial class UserControl1 : UserControl 
{ 
    object _anObject; 
    public object AnObject 
    { 
     get { return _anObject; } 
     set { _anObject = value; 
      if(value == null) VisualStateManager.GoToState(this, "WithoutObject", true); 
      else VisualStateManager.GoToState(this, "WithObject", true); 
     } 
    } 
    ... 
} 
Смежные вопросы