WPF에서 VisualStates를 enum 값에 쉽게 바인딩 할 수 있습니까? DataStateBehavior와 비슷하지만 열거 형의 경우?bool 대신 Enum에 대한 DataStateBehavior가 필요합니까? 끈?
답변
가장 좋은 방법은 바로 가서 않는 행동을 구현하는 것입니다 단지 -
public class EnumStateBehavior : Behavior<FrameworkElement>
{
public object EnumProperty
{
get { return (object)GetValue(EnumPropertyProperty); }
set { SetValue(EnumPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for EnumProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty EnumPropertyProperty =
DependencyProperty.Register("EnumProperty", typeof(object), typeof(EnumStateBehavior), new UIPropertyMetadata(null, EnumPropertyChanged));
static void EnumPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue == null) return;
EnumStateBehavior eb = sender as EnumStateBehavior;
VisualStateManager.GoToElementState(eb.AssociatedObject, e.NewValue.ToString(), true);
}
}
사용법은 매우 간단합니다 - 사용 다음과 같이
<i:Interaction.Behaviors>
<local:EnumStateBehavior EnumProperty="{Binding MyEnumProperty}" />
</i:Interaction.Behaviors>
가있는 DataStateSwitchBehavior있다 WP는 WPF로 포팅 될 수 있습니다 : Anyone have a DataStateSwitchBehavior for WPF4?
구문은 매우 간단합니다 :
<is:DataStateSwitchBehavior Binding="{Binding Orientation}">
<is:DataStateSwitchCase Value="Left" State="LeftState"/>
<is:DataStateSwitchCase Value="Right" State="RightState"/>
<is:DataStateSwitchCase Value="Down" State="DownState"/>
<is:DataStateSwitchCase Value="Up" State="UpState"/>
<is:DataStateSwitchCase/>
다른 상태로 GoToStateAction을 호출하는 각 트리거에서 가능한 열거 형 값당 DataTrigger를 사용하여 순수 xaml로 처리 할 수 있습니다. 아래 예제를 참조하십시오. 자세한 내용은 Enum driving a Visual State change via the ViewModel을 참조하십시오.
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Unanswered">
<ei:GoToStateAction StateName="UnansweredState" UseTransitions="False" />
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Correct">
<ei:GoToStateAction StateName="CorrectlyAnsweredState" UseTransitions="True" />
</ei:DataTrigger>
<ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Incorrect">
<ei:GoToStateAction StateName="IncorrectlyAnsweredState" UseTransitions="True" />
</ei:DataTrigger>
</i:Interaction.Triggers>
이것은 실제로 내가 대부분의 일을 처리하는 것을 끝내 었습니다. – Firoso
위의 EnumStateBehavior 답변에 문제가 있습니다.
PropertyChanged 처리기는 AssociatedObject가 null 인 경우 (바인딩이 설정되었으므로 Behavior가 아직 첨부되지 않았으므로) 처음 트리거됩니다. 또한 비헤이비어가 처음 첨부되면 VisualState 애니메이션의 대상 요소가 아직 존재하지 않을 수 있습니다. 비헤이비어가 다른 자식 비주얼 트리보다 먼저 첨부되었을 수 있기 때문입니다.
해결 방법은 연결된 개체의 Loaded 이벤트를 사용하여 바인딩의 초기 상태를 설정하는 것입니다.
public class EnumStateBehavior : Behavior<FrameworkElement>
{
public static readonly DependencyProperty BindingProperty =
DependencyProperty.Register(nameof(Binding), typeof(object), typeof(EnumStateBehavior), new UIPropertyMetadata(null, BindingPropertyChanged));
public object Binding
{
get { return (object)GetValue(BindingProperty); }
set { SetValue(BindingProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.Loaded += AssociatedObject_Loaded;
}
protected override void OnDetaching()
{
this.AssociatedObject.Loaded -= AssociatedObject_Loaded;
base.OnDetaching();
}
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
if (Binding != null)
GoToState();
}
private void GoToState()
{
VisualStateManager.GoToElementState(this.AssociatedObject, Binding.ToString(), true);
}
private static void BindingPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var eb = (EnumStateBehavior)sender;
if (e.NewValue == null || eb.AssociatedObject == null || !eb.AssociatedObject.IsLoaded)
return;
eb.GoToState();
}
}
- 1. enum에 대한 템플릿 특수화
- 2. Java enum에 대한 질문
- 3. DataStateBehavior가 작동하지 않는 이유
- 4. 디버그 대신 로그가 필요합니까?
- 5. Silverlight Enum에 대한 Combobox 데이터 바인딩
- 6. Enum에 캐스팅
- 7. enum에 대한 기본 hibernate 매핑 전략 변경
- 8. Wpf ListViewItem enum에 대한 배경 바인딩
- 9. 왜 자식 대신 darcs가 필요합니까?
- 10. BOOL 속성을위한 NSMatrix에 대한 바인딩
- 11. f (f bool) = bool 증명하기
- 12. scjp enum에 관한 질문
- 13. MySQL이 Enum에 필드 추가
- 14. 프로필 공급자의 bool 유형에 대한 기본값 null
- 15. 버튼을 눌렀는지 아닌지에 대한 bool 추가하기
- 16. silverlight에서 enum에 라디오 버튼 바인딩하기
- 17. 명확한 설명을 위해 함수에서 bool 대신 enum을 반환 하시겠습니까?
- 18. bool 연산자를 정의하는 대신 true 및 false를 오버로드하는 이유는 무엇입니까?
- 19. bool 유형에 대해 "true"및 "false"대신 이름 정의
- 20. nHibernate에 대한 지연로드가 필요합니까?
- 21. 텍스트 대신 파이핑 프리미티브,리스트, 구조체가 필요합니까?
- 22. WPF Charting Toolkit : SelectedItem 대신 SelectedItems가 필요합니까?
- 23. * any * enum에 대한 주석 특성을 선언 할 수있는 방법이 있습니까?
- 24. 하나의 특정 enum에 대한 확장 메서드를 만드는 방법
- 25. WPF 바인딩 enum에 ComboBox (비틀어 짐)
- 26. 그 외 enum에 해당하는 제품입니까?
- 27. BOOL 문제가
- 28. NSInvocationOperation (BOOL)
- 29. Objective-C Bool 질문
- 30. Monotouch : iPhone에서 비행기 모드를 끈 후에 WebRequest 연결이 실패합니다.
난 당신이 재정을 떠날 수 있다고 생각 ... 그리고 본질적으로 이것은 심지어 당신 말이 맞아 재정에 같은 행동 –
@Markus을 할 필요가 없다. 이 동작은 첨부 된 속성 일 수 있습니다. 그러나이 방법은 (A) Blend에서 사용할 수 있으며 (B) FrameworkElement에만 적용되도록 적용 할 수 있습니다. –
은 훌륭하게 작동합니다. 감사합니다. – thumbmunkeys