我有一个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);
}
答案 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
课程中,你必须在每个属性上实现它。