我有属性,我需要在属性更改时刷新View,但它不起作用
public WriteableBitmap OriginalBitmap = new WriteableBitmap(1280, 720);
private Image OriginalImage = new Image();
public Image Original
{
get { return OriginalImage; }
set
{
this.OriginalImage = value;
base.RaisePropertyChanged();
}
}
XAML
<Image Grid.Row="1"
Grid.Column="1"
x:Name="OriginalImg"
Source="{Binding Original}"
DataContext="{StaticResource MainViewModel}"/>
我正在使用MVVM库来RaisePropertyChanged
方法
public async Task<bool> ApplyEffectAsync(StorageFile file)
{
fileStream = await file.OpenAsync(FileAccessMode.Read);
OriginalBitmap.SetSource(fileStream);
Original.Source = OriginalBitmap;
}
Original
始终null
为什么呢?以及如何解决?
答案 0 :(得分:0)
您需要将属性的名称传入RaisePropertyChanged函数。它使用该名称告诉UI如果它绑定到具有该名称的属性,请获取更新的值。
Here is the Article on RaisePropertyChanged from MSDN
看起来应该是这样的
public Image Original
{
get { return OriginalImage; }
set
{
this.OriginalImage = value;
base.RaisePropertyChanged("Original");
}
}
答案 1 :(得分:0)
首先,将SetSource
更改为SetSourceAsync
await OriginalBitmap.SetSourceAsync(fileStream);
第二,我猜你不会从你的页面初始化你的Original
财产。
如果您使用MVVM - 初始化此属性。
((this.DataContext as MyViewModel).Original = myImage;
其中myImage
x:Name="myImage"
如果您不使用MVVM,请直接更改ImageSource:
myImage.Source = OriginalBitmap
第三,如果您使用MVVM,则可以将属性类型更改为
public BitmapImage Original
{
get { return _original; }
set
{
_original = value;
base.RaisePropertyChanged();
}
}
...
Original = OriginalBitmap;
并在XAML中使用此:
<Image Source="{Binding Original}"
....
答案 2 :(得分:0)
有一些事情需要纠正:
首先,建议将MainViewModel
实例设置为页面的datacontext。请不要将ViewModel设置为Image
控件的DataContext
,也不要将ViewModel
绑定为StaticResource
。你可以在XAML中设置它,如下所示:
<Page.DataContext>
<vm:MainPageViewModel x:Name="ViewModel"/>
</Page.DataContext>
或者您可以在代码隐藏中设置它:
MainPageViewModel ViewModel=new MainPageViewModel();
public MainPage()
{
this.InitializeComponent();
this.DataContext = ViewModel;
}
其次,Image.Source的类型为ImageSource
。要设置此属性,需要BitmapImage
或WriteableBitmap
的实例。因此,Original
对象应从Image
更改为BitMapImage
或WriteableBitmap
。您可以使用以下代码将StorageFile
转换为WriteableBitmap
:
IRandomAccessStream randomStream=await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
WriteableBitmap bitmap = new WriteableBitmap(500, 500);
bitmap.SetSource(randomStream);
第三,就像@Anthony Russel所说的那样。 MVVM lib可能需要知道属性的propertyName。
更新:您的ViewModel类应该类似于:
public class MainPageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public WriteableBitmap _original;
public WriteableBitmap Original
{
get { return this._original; }
set
{
this._original = value;
RaisePropertyChanged("Original");
}
}
public MainPageViewModel()
{ }
public MainPageViewModel(WriteableBitmap original)
{
this.Original = original;
}
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
和Xaml:
<Page.DataContext>
<vm:MainPageViewModel x:Name="ViewModel"/>
</Page.DataContext>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel VerticalAlignment="Center">
<Image Source="{Binding Original}"
x:Name="OriginalImg"
></Image>
<Button Name="myBtn" Click="myBtn_Click" >Click Me</Button>
</StackPanel>
</Grid>