无法设置属性(UWP)

时间:2016-07-13 14:47:38

标签: c# xaml uwp

我有属性,我需要在属性更改时刷新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

为什么呢?以及如何解决?

3 个答案:

答案 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。要设置此属性,需要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 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>