簡體   English   中英

無法設置屬性(UWP)

[英]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.SourceImageSource類型。 要設置此屬性,需要使用BitmapImageWriteableBitmap的實例。 因此,應將Original對象從Image更改為BitMapImageWriteableBitmap 您可以使用以下代碼將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM