[英]Cant set the property (UWP)
我有属性,并且在属性更改时我需要始终刷新视图,但是它不起作用
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
为什么? 以及如何解决?
您需要将属性名称传递给RaisePropertyChanged函数。 它使用该名称告诉UI,如果它绑定到具有该名称的属性,请获取更新后的值。
这是MSDN上有关RaisePropertyChanged的文章
它应该看起来像这样
public Image Original
{
get { return OriginalImage; }
set
{
this.OriginalImage = value;
base.RaisePropertyChanged("Original");
}
}
首先,将SetSource
更改为SetSourceAsync
await OriginalBitmap.SetSourceAsync(fileStream);
第二,我想您不会从Page初始化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}"
....
有几件事需要纠正:
首先,建议将MainViewModel
实例设置为页面的数据上下文。 请不要将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库可能需要知道您的属性的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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.