繁体   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