2016-07-08 6 views
0

私が作成したクラス内の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); 
} 
+0

'INotifyPropertyChanged'の実装がありません... – lokusking

+0

Patternプロパティのセッターを意味しますか?またはWPFSliceのために?それはWPFSliceにあるので(私はちょうど元のコードに入れなかった)。私は投稿を編集します。私は、MVVMパターンに違反しているので、私のコードの後ろに(パターンプロパティを定義する)INotifyPropertyChangedを追加できるとは思わない。 – andyopayne

答えて

1

を。

public class YourClass: INotifyPropertyChanged 
{ 
public event PropertyChangedEventHandler PropertyChanged; 

public void OnPropertyChanged(PropertyChangedEventArgs e) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, e); 
    } 
} 

protected PatternVoxelBased mPattern = new PatternVoxelBased(); 
public PatternVoxelBased Pattern 
{ 
    get { return mPattern ; } 
    set { mPattern = value; OnPropertyChanged(new PropertyChangedEventArgs("Pattern"));} 
} 
} 

EDITはあなたPattern級で

、あなたも、すべての財産上のことを実装する必要があります。

+0

そのクラスのINotifyPropertyChangedに継承を追加できないようです。これは私の.xamlのコードビハインドにあります。したがって、私のクラス構造は次のようになります:パブリック部分クラスCreatePattern:UserControl {....} – andyopayne

+0

また、Imageは、あなたが言及したINotifyPropertyChanged継承を追加せずにダイアログが最初に開かれたときに正しいImageSourceを正しく表示します – andyopayne

+0

はい、表示されるのは1回だけです。その後、バインディングは変更について一度も気づかれません。 – lokusking

関連する問題