2017-05-09 4 views
4

VisualState에서 Setters Value 속성을 사용하여 바인딩을 실제로 사용할 수 있습니까? x : Bind를 사용하려고하면 페이지의 초기 뷰가 바인딩을 사용하지 않고 Binding은 페이지를 사용하지 않기 때문입니다. 그 (것)들을 이제까지 이용하십시오 또는 나는 무언가를 추가 할 필요가 있는가?VisualState Setters의 UWP 바인딩

예를 들어 아래 레이아웃을 사용하고 400에서 800 사이의 너비로 앱을 시작하면 PassInput Passwordbox에 자리 표시자가 없습니다. 창 크기를 800 이상으로 조정 한 다음 마침내 자리 표시자를 갖습니다.

예 :

<Page 
    x:Class="UWP.Learning.MainPage" 
    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" 
    mc:Ignorable="d" 
    x:Name="Page"> 
    <RelativePanel Background="White"> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="WindowSizeStates"> 
       <VisualState x:Name="SmallState"> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="400" /> 
        </VisualState.StateTriggers> 
        <VisualState.Setters> 
         <Setter Target="PassInput.PlaceholderText" Value="{x:Bind MyPlaceHolder, Mode=OneWay}" /> 
        </VisualState.Setters> 
       </VisualState> 
       <VisualState x:Name="WideState"> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="800" /> 
        </VisualState.StateTriggers> 
        <VisualState.Setters> 
         <Setter Target="PassInput.PlaceholderText" Value="{x:Null}" /> 
        </VisualState.Setters> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <TextBlock 
      Name="PassLabel" 
      RelativePanel.AlignTopWithPanel="True" 
      RelativePanel.AlignLeftWithPanel="True" 
      RelativePanel.AlignRightWithPanel="True" 
      Text="Pass input label" 
      HorizontalAlignment="Center" /> 
     <PasswordBox 
      Name="PassInput" 
      RelativePanel.AlignLeftWithPanel="True" 
      RelativePanel.AlignRightWithPanel="True" 
      RelativePanel.Below="PassLabel" 
      VerticalAlignment="Center" 
      Margin="20,0" /> 
    </RelativePanel> 
</Page> 

코드 숨김

namespace UWP.Learning 
{ 
    using Windows.UI.Xaml.Controls; 

    public sealed partial class MainPage : Page 
    { 
     public MainPage() { this.InitializeComponent(); } 
     public string MyPlaceHolder => "FOOBAR"; 
    } 
} 

답변

5

나에게 버그 것 같은데. 쉬운 해결 방법은 Loaded 이벤트에서 일회성 점검을하는 것입니다.

Loaded += (s, e) => 
{ 
    switch (ActualWidth) 
    { 
     case var w when (w >= 400 && w < 800): 
      VisualStateManager.GoToState(this, "SmallState", false); 
      break; 
     case var w when (w >= 800): 
      VisualStateManager.GoToState(this, "WideState", false); 
      break; 
    } 
}; 
+0

그래서 XamlBehaviors를 사용하여 시각적 상태에 대한 새로 고침을 호출하고보고했습니다. – WaggaWagga

+0

나는 이것을 버그라고 부를지 모르겠다. 나에게 그것은 이와 같이 보입니다 - PasswordBox.Placeholder가 아니라 setter의 값이 바인드됩니다. 따라서 우리가 속성과 cal * OnPropertyCHanged *를 변경하면 아무 일도 일어나지 않을 것입니다. 따라서 setter의 값만 영향을받습니다. 변경 사항을 보려면 시각적 상태를 호출해야합니다. 로드 중 * 이벤트에서 'x : Bind'가 설정되고 처음 트리거가 호출되면 바인딩이 준비되지 않고 트리거가 충돌하여 확인할 수 있습니다. * WindowSizeStates.CurrentState * is *없는*. – Romasz

+0

이전 바인딩을 사용하고 FallbackValue를 설정하면 처음 사용 된 것을 볼 수 있습니다. 이전 바인딩을 사용하면 Loaded 이벤트를 호출 할 수 있습니다 : 'VisualStateManager.GoToState (this, WindowSizeStates.CurrentState.Name, false);'그리고 새로운 'x : Bind'를 사용하여 바인딩이 해결되지 않았으므로 사용할 수 없습니다 * CurrentState *는 널입니다. – Romasz

관련 문제