2016-07-13 5 views
0

У меня есть свойство, и мне нужно, чтобы обновить вид всегда, когда свойство изменяется, но он не работаетБрус установить свойство (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}"/> 

Im используя MVVM библиотеки для RaisePropertyChanged

И метод

public async Task<bool> ApplyEffectAsync(StorageFile file) 
{ 

     fileStream = await file.OpenAsync(FileAccessMode.Read); 
     OriginalBitmap.SetSource(fileStream); 
     Original.Source = OriginalBitmap; 
} 

Original всегда null

Почему? И как исправить?

+0

, где и как определяется OriginalImage? – Alex

+0

Я обновил свой вопрос – SmiLe

ответ

0

Необходимо передать имя объекта функции RaisePropertyChanged. Он использует это имя, чтобы сообщить пользовательскому интерфейсу, что если он привязан к свойству с этим именем, перейдите к обновленному значению.

Here is the Article on RaisePropertyChanged from MSDN

Это должно выглядеть примерно так

public Image Original 
{ 
    get { return OriginalImage; } 
    set 
    { 
     this.OriginalImage = value; 
     base.RaisePropertyChanged("Original"); 
    } 
} 
+0

Да, я читал это, но я не могу понять, как его работа. Im написал 'base.RaisePropertyChanged (" OriginalImg ");' где 'OriginalImg' is' x: Name = "OriginalImg" 'on view – SmiLe

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}" 
     .... 
+0

Невозможно изменить тип' Image' на 'BitmapImage' или' Writable BitmapImage', потому что can not convert Xaml. Image to Bitmap – SmiLe

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.Для установки этого свойства требуется экземпляр 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 lib может понадобиться знать свойствоName вашего свойства.

Update: Ваш класс 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> 
+0

Если у меня есть несколько 'Datacontext', нужно ли делать' MainViewModel', как в вашем примере? – SmiLe

+0

И им есть код для преобразования 'StorageFile' в' WriteableBitmap'. Но какой параметр должен находиться в 'RaisePropertyChanged()'? Im try '" Original "', try '" OriginalImg "' (Как на моей странице просмотра) – SmiLe

+0

Если у вас есть несколько Datacontext, установите DataContext в код. И установите datacontext на родительскую панель управления элементами изображения (например, myGrid.DataContext = ViewModel.). –

Смежные вопросы