.NETFramework4.0に切り替えるときに問題が発生しました。Top/LeftおよびWidht/Heightプロパティで双方向バインディングを使用するウィンドウがあります。
viewModelを変更する必要があるときに問題が発生します。
基になるViewModelを変更した後、viewModelに対応するpropertynameでPropertyChangedイベントをトリガーすると、Leftプロパティのバインディングがトリガーされ、ウィンドウが正しいX位置に移動します。しかし、ウィンドウを移動するアクションは「ソースへ」をトリガーし、viewModelのTopプロパティを設定します。 編集:「設定」は行われていませんが、Yバインディングは処理されません。
Height&Widthプロパティと同じ動作。
これが私の問題を示す小さなアプリケーションです。
これがモデルです:
public class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Position SelectedPos { get; set; }
public Position Pos1 { get; set; }
public Position Pos2 { get; set; }
public Model( int x, int y, int x2, int y2 )
{
Pos1 = new Position( x, y );
Pos2 = new Position( x2, y2 );
SelectedPos = Pos1;
}
public void Toggle()
{
SelectedPos = Pos2;
if( PropertyChanged != null )
{
var e = new PropertyChangedEventArgs( "SelectedPos" );
PropertyChanged( this, e );
}
}
}
public class Position
{
int _x;
public int X
{
get { return _x; }
set { _x = value; }
}
int _y;
public int Y
{
get { return _y; }
set { _y = value; }
}
public Position( int x, int y )
{
X = x;
Y = y;
}
}
そしてここにビューがあります:
<Window x:Class="WpfApplication1.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"
Left="{Binding Mode=TwoWay, Path=SelectedPos.X}"
Top="{Binding Mode=TwoWay, Path=SelectedPos.Y}">
<Grid>
<Button Click="Button_Click">Change Position</Button>
</Grid>
</Window>
そして最後に、コードビハインド:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
Model model;
public MainWindow()
{
InitializeComponent();
model = new Model( 5, 5, 500, 500 );
DataContext = model;
}
private void Button_Click( object sender, RoutedEventArgs e )
{
model.Toggle();
}
}
}
私が知りたかったのは、バインディングを「フリーズ」して、要求したすべてのバインディングの処理が完了するまでエンジンがviewModelを設定しないようにする方法があるかどうかです。または、バインディングをtwoWayからOneWayに短時間切り替えます。
ここでの小さなアプリケーションは、.NET Framework 3.5を使用すると正しく動作しますが、4.0では動作しません。
同じ問題に苦しんでいる人を見つけることができなかったので驚いています、私は何か間違ったことをしていますか?ご回答ありがとうございます。不明な点がございましたら、お気軽にお問い合わせください。
Jean-Loup Kahloun
今朝ログを追加しました(ここに投稿する前に追加する必要があります)。あなたが行ったように、「設定」は行われていませんが、Yバインディングは処理されません。実際にウィンドウの位置を数回切り替えると、動作はさらに奇妙になります。
コードビハインドの使用を避けたかったのですが、ソリューションをテストします(テスト目的でのみ使用したものもあります)。
迅速に回答していただきありがとうございます。コードビハインドのない解決策を見つける時間ができたら、折り返しご連絡いたします。モデルが設定されていないため、奇妙な動作をする「Position」バインディングがトリガーされた直後に、propertychangedイベントでXバインディングとYバインディングを別々にトリガーできる可能性があります。
もう一度ありがとう、私は間違った方向に進んでいました、あなたは私にたくさんの時間を節約しました。