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");
}
}
フォーカスがあるテキストボックスは、それがある限り、それは持っているように、コンテンツのアップデートではないだろうかのようにそれはあります焦点。
あまりにも多くの代名詞十分なはず
がRaisePropertyChanged結合あなたのテキストボックスから
削除してください!私はあなたの問題の説明を理解していません。より正確に言えば、どのユーザーアクションが実行されたのか、何が起こったのか、そして何を期待したのかが完全に明確になるようにしてください。ビューモデルが何らかの形で変更されたときにビューが更新されないか、ビューが何らかの形で変更されたときにビューモデルが更新されないかどうかは、あなたの投稿からは分かりません。また、なぜa)ハイフンを追加して入力を修正するのか、そしてb)なぜ 'Item1'セッターで '_item2 'を設定するのかは明らかではありません。 –
私はこの動作が意図的だと思うでしょう、あなたがテキストボックスに入力していて、viewmodelプロパティが変更されたときに突然その値が途中で変わると、迷惑でしょう。 –
@PeterDuniho問題が発生した後、viewmodelで値が変更され、テキストボックスがその瞬間に焦点を当てている場合、Viewはテキストボックスの内容を更新しません。 viewmodelでバインドされている値が変更され、raisepropertychangedが呼び出された場合、テキストボックスの値は更新されません。 – Bolke