2017-06-29 18 views
0

TabControlに配置されたTextBoxコントロールで奇妙な動作が発生しました。
TextBoxコントロールの値を変更してフォーカスを変更しないとき、タブを変更するとこのTextBoxの変更が緩和されます。
フォーカスを変更してタブを変更すると、すべてが保存されます。WPF、TabControlとBinding

してください、例GIF参照:

Example gif

ここでは私のコードです:
XAML:背後

<Window x:Class="TabPanelTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl Name="tabs" ItemsSource="{Binding}"> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <StackPanel Background="{Binding ContainterColor}"> 
         <TextBox Text="{Binding Val1, Mode=TwoWay}" Margin="20 10"/> 
         <TextBox Text="{Binding Val2, Mode=TwoWay}" Margin="20 10"/> 
         <TextBox Text="{Binding Val3, Mode=TwoWay}" Margin="20 10"/> 
        </StackPanel> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 
    </Grid> 
</Window> 

コード:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace TabPanelTest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      MyClass myObj1 = new MyClass("Tab1"); 
      MyClass myObj2 = new MyClass("Tab2"); 

      myObj1.ContainterColor = new SolidColorBrush(Colors.LightGreen); 
      myObj2.ContainterColor = new SolidColorBrush(Colors.LightBlue); 

      myObj1.Val1 = "Tab1 Val1"; 
      myObj1.Val2 = "Tab1 Val2"; 
      myObj1.Val3 = "Tab1 Val3"; 

      myObj2.Val1 = "Tab2 Val1"; 
      myObj2.Val2 = "Tab2 Val2"; 
      myObj2.Val3 = "Tab2 Val3"; 

      InitializeComponent(); 
      tabs.DataContext = new MyClass[] { myObj1, myObj2 }; 
      tabs.SelectedIndex = 0; 


     } 
    } 

    public class MyClass: INotifyPropertyChanged 
    { 
     public string Name { get; set; } 

     Brush _containerColor; 
     string val1; 
     string val2; 
     string val3; 

     public Brush ContainterColor 
     { 
      get 
      { 
       return _containerColor; 
      } 
      set 
      { 
       if(value!=_containerColor) 
       { 
        _containerColor = value; 
        OnPropertyChanged("ContainterColor"); 
       } 
      } 
     } 

     public string Val1 
     { 
      get 
      { 
       return val1; 
      } 
      set 
      { 
       if (value != val1) 
       { 
        val1 = value; 
        OnPropertyChanged("Val1"); 
       } 
      } 
     } 
     public string Val2 
     { 
      get 
      { 
       return val2; 
      } 
      set 
      { 
       if (value != val2) 
       { 
        val2 = value; 
        OnPropertyChanged("Val2"); 
       } 
      } 
     } 

     public string Val3 
     { 
      get 
      { 
       return val3; 
      } 
      set 
      { 
       if (value != val3) 
       { 
        val3 = value; 
        OnPropertyChanged("Val3"); 
       } 
      } 
     } 

     public override string ToString() 
     { 
      return Name; 
     } 

     public MyClass(string name) 
     { 
      Name = name; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

フォーカスが変更されていない場合、変更を保存するにはどうすればよいですか?

ありがとうございます!

アップデート:@ MM8へと@Fruchtzwergに

おかげでたくさん!
そう単純なこと... :)

答えて

2

。この時点でタブを切り替えると、変更が失われたことを意味します。 UpdateSourceTriggerPropertyChangedを設定すると、文字を変更した直後にプロパティが更新されます。

+0

あなたは正しいです!どうもありがとう! :) –

2

PropertyChangedにバインディングのUpdateSourceTriggerを設定してください:

<TextBox Text="{Binding Val1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="20 10"/> 

これはTextBoxがフォーカスを失った直前に設定を取得するには、プロパティを強制すべきです。デフォルト値はLostFocusです。デフォルトでは

<TextBox Text="{Binding Val, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

フォーカスが失われた後、あなたのTextBoxの束縛textプロパティが更新された:あなたはあなたの焦点bevoreプロパティを更新するためにPropertyChangedへの結合のUpdateSourceTriggerが同様に失われた設定する必要が

+0

あなたはそうです!どうもありがとう! :) –