次の簡単なプログラムは、データバインディングの頭痛の種を引き起こしています。私はこれに不慣れであるため、簡単な答えがあると思います。基本的に、同じプロパティmyStringにバインドされた2つのテキストボックスがあります。myStringが変更されたときにビューに通知を提供するようにViewModel(単に1つのプロパティmyStringを持つクラス)を設定していないため、両方のテキストボックスが双方向バインディングを実行していても、テキストボックスが双方向にバインドされることはありません。 myStringが変更されたときに更新します、私は正しいですか?
それ外...
ほとんどの場合、これは当てはまります。ウィンドウの下部にある[値の変更]ボタンを使用して、myStringの値を、ユーザーが隣接するテキストボックスに入力したものに変更し、上部にある2つのテキストボックスを変更します。 myStringにバインドされているため、変更しないでください。罰金。ただし、TextBox1のテキストを編集して、myStringの値を変更した場合(ただし、デフォルトのUpdateSourceTriggerプロパティが原因でテキストボックスがフォーカスを失った場合のみ、リファレンスを参照)、TextBox2はmyStringの更新を受信しないため、更新しないでください。変更されました。ただし、TextBox1がフォーカスを失うとすぐに(たとえば、TextBox2内をクリックすると)、TextBox2はmyStringの新しい値で更新されます。
これまでの私の推測では、TextBoxは同じプロパティにバインドされているため、TextBox1がmyStringを更新すると、TextBox2に変更が通知されます。INotifyPropertyChangedなどを使用したことがないため、非常に混乱します。
明確にするために、私はこれを修正する方法を尋ねていません。バインディングモードを一方向オプションに変更できることはわかっています。誰かがこの奇妙な行動の説明を思い付くことができるかどうか疑問に思いますか?
ViewModel:
namespace WpfApplication1
{
class ViewModel
{
public ViewModel()
{
_myString = "initial message";
}
private string _myString;
public string myString
{
get
{
return _myString;
}
set
{
if (_myString != value)
{
_myString = value;
}
}
}
}
}
意見:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Grid>
<!-- The culprit text boxes -->
<TextBox Height="23" HorizontalAlignment="Left" Margin="166,70,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=myString, Mode=TwoWay}" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="166,120,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=myString, Mode=TwoWay}"/>
<!--The buttons allowing manual change of myString-->
<Button Name="changevaluebutton" Content="change value" Click="ButtonUpdateArtist_Click" Margin="12,245,416,43" Width="75" />
<Button Content="Show value" Height="23" HorizontalAlignment="Left" Margin="12,216,0,0" Name="showvaluebutton" VerticalAlignment="Top" Width="75" Click="showvaluebutton_Click" />
<Label Content="" Height="23" HorizontalAlignment="Left" Margin="116,216,0,0" Name="showvaluebox" VerticalAlignment="Top" Width="128" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="116,245,0,0" Name="changevaluebox" VerticalAlignment="Top" Width="128" />
<!--simply some text-->
<Label Content="TexBox1" Height="23" HorizontalAlignment="Left" Margin="99,70,0,0" Name="label1" VerticalAlignment="Top" Width="61" />
<Label Content="TexBox2" Height="23" HorizontalAlignment="Left" Margin="99,118,0,0" Name="label2" VerticalAlignment="Top" Width="61" />
</Grid>
</Window>
ビューの背後にあるコード:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ViewModel viewModel;
public MainWindow()
{
InitializeComponent();
viewModel = (ViewModel)this.DataContext;
}
private void showvaluebutton_Click(object sender, RoutedEventArgs e)
{
showvaluebox.Content = viewModel.myString;
}
private void ButtonUpdateArtist_Click(object sender, RoutedEventArgs e)
{
viewModel.myString = changevaluebox.Text;
}
}
}