私が作成したクラス内のImageSource要素にバインドされているImage要素があります。 ImageSourceは、スライダが変更されるたびに更新されます。最初にウィンドウをインスタンス化すると、ユーザーがファイルをロードするまで、ImageSourceは空白になります。ファイルがロードされると、イメージが表示され、ユーザーはスライダをスクロールしてイメージの変更を確認できます。ダイアログで「OK」を選択すると、このパターンを保存できます。これはすべて正常に動作します。リロードウィンドウで画像バインディングが機能しない
ただし、ListViewで項目をダブルクリックすると、このダイアログが再度開き、編集がさらに行われます。したがって、新しいダイアログを作成して、イメージに関する関連情報をリロードします。しかし、何らかの理由で...イメージバインドはもはや機能しません。私はImageSourceゲッターにブレークポイントを置くことができ、スライダーを変更するたびにイメージが更新されます...しかし、それは正しくバインドされているようには見えません。ウィンドウが最初に開いたときに正しくバインドされるのはなぜですか?それ以降のウィンドウではバインドされません。私は自分のコードをレイアウトしようとします。私の.xamlコードで
:
<UserControl x:Class="MyControls.CreatePattern"
x:Name="PatternCreation"
...
d:DesignHeight="160" d:DesignWidth="350">
<Slider Value="{Binding ElementName=PatternCreation, Path=Pattern.ZNorm, Mode=TwoWay}" Maximum="1" Name="Slider" VerticalAlignment="Stretch" />
<Image Name="PatternPreview" Source="{Binding ElementName=PatternCreation, Path=Pattern.WPFSlice}" Stretch="Uniform"></Image>
</UserControl
私のコードでは、私がバインドするパターン定義の後ろに:私のPatternVoxelBasedクラスで
protected PatternVoxelBased mPattern = new PatternVoxelBased();
public PatternVoxelBased Pattern
{
get { return mPattern ; }
set { mPattern = value; }
}
を、私は次のように定義されたWPFSliceとZNorm性質を持っていますこれは:
protected ImageSource mWPFSlice;
public ImageSource WPFSlice
{
get { return mWPFSlice; }
set
{
mWPFSlice = value;
NotifyPropertyChanged("WPFSlice");
}
}
protected double mZNorm = 0.5;
public double ZNorm
{
get { return mZNorm; }
set
{
if (mZNorm == value) return;
mZNorm = value;
NotifyPropertyChanged("ZNorm");
WPFSlice = BuildImageAtZ(mZNorm);
}
}
初めてダイアログウィンドウをロードするイベントがあります。
private void CreatePattern_Click(object sender, RoutedEventArgs e)
{
CCreateVoxelPattern dlg = new CCreateVoxelPattern();
dlg.DataContext = DataContext;
dlg.CShow(PatternLibraryMenu);
}
私のListViewのダイアログウィンドウリロードする機能をダブルクリックしてください:これはあなたがINotifyPropertyChanged
を実装する必要が
protected PatternVoxelBased mPattern = new PatternVoxelBased();
public PatternVoxelBased Pattern
{
get { return mPattern ; }
set { mPattern = value; }
}
であるあなたのクラスで
private void ListViewPatternLibrary_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
PatternVoxelBased item = ((ListView)sender).SelectedValue as PatternVoxelBased;
CCreateVoxelPattern dlg = new CCreateVoxelPattern();
dlg.DataContext = DataContext;
dlg.Main.Pattern = item;
dlg.Main.LoadPattern();
dlg.CShow(PatternLibraryMenu);
}
public void LoadPattern()
{
if (Pattern == null) return;
Pattern.WPFSlice = Pattern.BuildImageAtZ(Pattern.ZNorm);
}
'INotifyPropertyChanged'の実装がありません... – lokusking
Patternプロパティのセッターを意味しますか?またはWPFSliceのために?それはWPFSliceにあるので(私はちょうど元のコードに入れなかった)。私は投稿を編集します。私は、MVVMパターンに違反しているので、私のコードの後ろに(パターンプロパティを定義する)INotifyPropertyChangedを追加できるとは思わない。 – andyopayne