[英]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.