2016-11-04 46 views
-1

Mvvmライブラリ、UWP、C#を使用しています。RaisePropertychangedでTextboxバインディングが更新されない

問題:viewmodelで値が変更され、その時点でテキストボックスがフォーカスされている場合、Viewはテキストボックスの内容を更新しません。フォーカスがないテキストボックスのviewmodelプロパティを更新することは可能です。

混乱をクリアするには:テキストボックス - >何かが入力されています - >バインドされたプロパティに渡されます - >プロパティセット、値を変更してRaisePropertyChangeを呼び出します。 - >テキストボックスは更新されません。

ViewModelで別のTextBoxにバインドされているプロパティが変更され、RaisePropertyChangedがそのプロパティをターゲットとして呼び出された場合、そのTextBoxは更新されます。

フォーカスがあるテキストボックスがRaisePropertyChangedで更新されないという違いがあるようです。それはwpfでこれをします。

以下のコードは、実際のアプリケーションではなく、一例です。それは問題を示し、実際のアプリケーションのように動作します。ハイフンは、入力を変更するために追加されます。 RaisePropertyChangedが機能した場合は、ハイフンがエディットボックスに表示されますが、ハイフンは表示されません。

マイページ:

<Page x:Class="BindingTest.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:BindingTest.VML" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
DataContext="{Binding MainViewModel, Source={StaticResource Locator}}" > 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="0,144,0,109"> 
    <TextBox x:Name="textBox1" 
      Text="{Binding Item1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
      HorizontalAlignment="Left" 
      Margin="10,137,0,0" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top" 
      Width="340"/> 

    <TextBox x:Name="textBox2" 
      Text="{Binding Item2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
      HorizontalAlignment="Left" 
      Margin="10,174,0,0" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top" 
      Width="340"/> 
</Grid> 

私のViewModel:テキストはテキストボックスのいずれかに置かれている場合は、プロパティのセットが

using GalaSoft.MvvmLight; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Input; 

namespace BindingTest 
{ 
    public class MainViewModel:ViewModelBase 
    {   
     string _item1 = ""; 
     string _item2 = ""; 

     public string Item1 { 
      get 
      { 
       return _item1; 
      } 
      set 
      { 
       _item1 = value + "-"; 
       RaisePropertyChanged("Item1");        
      } 
     } 

     public string Item2 
     { 
      get { 
       return _item2; 
      } 
      set 
      { 
       _item2 = value + "-"; 
       RaisePropertyChanged("Item2"); 
      } 
     } 
    } 
} 

と呼ばれ、値が変更されます、値はテキストボックスで更新されません。

私はのTextBox1のセッターにTextBox2をするにPropertyChangedを呼び出したい場合、それが更新されます:

 public string Item1 { 
      get 
      { 
       return _item1; 
      } 
      set 
      { 
       _item2 = value + "-"; 
       RaisePropertyChanged("Item2");        
      } 
     } 

フォーカスがあるテキストボックスは、それがある限り、それは持っているように、コンテンツのアップデートではないだろうかのようにそれはあります焦点。

+0

あまりにも多くの代名詞十分なはず

がRaisePropertyChanged結合あなたのテキストボックスから

updateSourceTrigger=PropertyChanged 

削除してください!私はあなたの問題の説明を理解していません。より正確に言えば、どのユーザーアクションが実行されたのか、何が起こったのか、そして何を期待したのかが完全に明確になるようにしてください。ビューモデルが何らかの形で変更されたときにビューが更新されないか、ビューが何らかの形で変更されたときにビューモデルが更新されないかどうかは、あなたの投稿からは分かりません。また、なぜa)ハイフンを追加して入力を修正するのか、そしてb)なぜ 'Item1'セッターで '_item2 'を設定するのかは明らかではありません。 –

+1

私はこの動作が意図的だと思うでしょう、あなたがテキストボックスに入力していて、viewmodelプロパティが変更されたときに突然その値が途中で変わると、迷惑でしょう。 –

+0

@PeterDuniho問題が発生した後、viewmodelで値が変更され、テキストボックスがその瞬間に焦点を当てている場合、Viewはテキストボックスの内容を更新しません。 viewmodelでバインドされている値が変更され、raisepropertychangedが呼び出された場合、テキストボックスの値は更新されません。 – Bolke

答えて

0

はviewmodelの上が明確な前例を欠く

+0

これは動作しません。これにより、エディットボックスが終了時に変更されずにトリガーされ、フォーカスがあるテキストボックスは更新されません。 – Bolke

関連する問題