2013-08-06 2 views
5

3 개의 개체, 2 개의 목록 및 텍스트 상자가있는 탭 컨트롤이 있습니다. 텍스트 상자 바인딩 두 방법 :텍스트 상자 양방향 바인딩 트리거 안 함

<TabControl x:Name="tcTabs" ItemsSource="{Binding Rooms, UpdateSourceTrigger=PropertyChanged}" Margin="5" BorderThickness="1" IsSynchronizedWithCurrentItem="True"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Name}" /> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*"/> 
           <RowDefinition Height="22"/> 
          </Grid.RowDefinitions> 

          <ListBox ItemsSource="{Binding ReceivedMessages}" DisplayMemberPath="Raw" Grid.Row="0" Grid.Column="0" BorderThickness="0" /> 
          <ListBox ItemsSource="{Binding Users}" DisplayMemberPath="Nick" Visibility="{Binding Type, Converter={StaticResource UserListVisibilityConverter}}" Grid.Row="0" Grid.Column="1" BorderThickness="1,0,0,0" BorderBrush="#FFBBBBBB" Width="130" /> 
          <TextBox Text="{Binding CurrentInput, Mode="TwoWay"}" Grid.Row="1" Grid.ColumnSpan="2" BorderThickness="0,1,0,0" BorderBrush="#FFBBBBBB" Height="22" /> 
         </Grid> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

백업 개체 :

public string CurrentInput 
{ 
    get 
    { 
     return _currentInput; 
    } 
    set 
    { 
     if (value != _currentInput) 
     { 
      _currentInput = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

문제는 내가 텍스트를 변경하고 다른 탭을 클릭 할 때이 백업 필드 (도 충돌하지 않습니다를 업데이트하지 않습니다이며, setter)하지만, 내가 바꾼다면리스트 박스를 클릭하십시오.

이 이상한 행동에 대한 이유는 무엇입니까?

+0

를 사용하여 데이터 바인딩 엔진을이 문제를 해결했습니다 '. 이미 시도한 경우 무시하십시오. –

답변

3

이상한 행동이 아니며 전에 여러 번 질문을 받았습니다. Binding.UpdateSourceTrigger에 대해 읽으십시오. 또한 the respective property의 비고를 참조하십시오.

+0

필자는 나의 무지를 모독하지만 "데이터 바인딩 시나리오에서 사용되면이 속성은 UpdateSourceTrigger.LostFocus의 기본 업데이트 동작을 사용합니다." - 다른 탭을 클릭하면 "포커스를 잃지"않으므로 업데이트를 트리거해야합니까? – sprocket12

+1

@MuhammadA : WPF에는 포커스 범위가 있습니다. 모든 탭에 자체 범위가 있고 TextBox에 여전히 포커스가있는 경우 WPF에 포커스 범위가 있습니다. 포커스를 잃기 전에 컨트롤을 제거 할 수도 있습니다. –

+0

예. 다른 질문보다 여러 번 복잡한 질문입니다. 당신의 도움을 주셔서 감사합니다. – sprocket12

0

나는 수동 트리거에 의해 (양방향 바인딩) 이것은 또한`OnPropertyChanged를 ("CurrentInput")와 같은 OnPropertyChanged를 법에서 속성이 아닌 점의 원인이 될 수

DataContext = this; 
+1

안녕하세요,이 유일한 코드 줄에 더 많은 컨텍스트를 제공하면 좋을 것입니다. 질문에는 단단한 문맥이 있습니다.이 대답을 자세히 설명하면 훨씬 많은 사람들을 도울 수있을 것입니다. – Sombriks