图像绑定在重新加载窗口上不起作用

时间:2016-07-08 19:10:51

标签: c# wpf

我有一个Image元素绑定到我创建的类中的ImageSource元素。每次更改滑块时,ImageSource都会更新。当我第一次实例化我的窗口时,ImageSource是空白的,直到用户加载文件。加载文件后,将显示图像,用户可以滚动滑块并查看图像更改。然后,他们可以在对话框中选择“确定”以保存此模式。一切正常。

但是,如果他们双击ListView中的项目,则会重新打开此对话框以进行进一步编辑。因此,它会创建一个新对话框,然后重新加载有关图像的相关信息。但是,无论出于何种原因......图像绑定不再有效。我可以在ImageSource getter上放置一个断点,每次更改滑块时,图像都会更新......但是,它只是没有正确绑定。为什么它会在第一次打开窗口时正确绑定,而不是在后续打开时绑定。我会尝试列出我的代码。

在我的.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

在我的代码中,我定义了要绑定的模式:

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

在我的PatternVoxelBased类中,我有一个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双击功能重新加载对话框窗口:

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);
 }

1 个答案:

答案 0 :(得分:1)

在你的班级中

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

您必须实施INotifyPropertyChanged

示例

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"));}
}
}

修改

在你的Pattern课程中,你必须在每个属性上实现它。