2016-12-15 1 views
1

私はxamlとc#でUWPプロジェクトに取り組んでいます。右の画像のスタックパネルをクリックすると画像がクリックされ、関連する大きな画像がスタックパネルの左側に表示されます。クリック時にUIが正しい画像に更新されるようにするにはどうすればよいですか?

大きな画像は最初に、ページを読み込むときにスタックパネルの最初の「小さい」画像に関連する「大きな」画像に設定されますが、スタックパネルの他の小さな画像のいずれかをクリックすると、更新されません。

全体がフライアウト内に配置されたデータテンプレートです。 「大」の画像に関連するXAMLはここにある:

<Border Background="White" Grid.Row="2"> 
    <Image Stretch="Uniform"> 
     <Image.Source> 
      <BitmapImage UriSource="{Binding SelectedImage}" /> 
     </Image.Source> 
    </Image> 
</Border> 

小さな画像をクリックすると、その画像のための「タップ」メソッドをトリガーし、その方法は次のとおりです。

private void Image_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    var img = ((Windows.UI.Xaml.Controls.Image)sender).DataContext as obj 
    img.FlyoutContent.SelectedImage = new Uri(img.relatedPath); 
} 

私は上記のコードを使用して画像を最初に設定してください。小さな画像をクリックすると大きな画像が変わることはありません。

デバッガで、stackpanelの小さな画像をクリックすると、 "image tapped"メソッドが壊れてしまい、URIが正しく更新されていてバインディングエラーがないことがわかります。 UIは決して変更されません。

私には何が欠けていますか?

は、 ザック

をいただき、ありがとうございます*サイドノート:「objが」カスタムクラスのちょうど作られた名前です。

+0

あなたはおそらく既に画像を示しクリックした画像、ソース設定されているようですが、少し見えます。正しい画像の画像ソースを変更してもよろしいですか? –

+0

あなたが何を求めているのか分かりません。大きな画像に同じURIを単純に再割り当てするかどうか尋ねていますか? – zachboy82

+0

参照を取得している正しいDataContextオブジェクトかどうかを確認しています。 SelectedImageのパスは、変更する前と変更していますか? –

答えて

0

Bindingプロパティの場合は、UIが自動的に更新されるようにINotifyPropertyChangedクラスを実装する必要があります。

class CustomClass : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    private string _imageLink; 
    public string ImageLink 
    { 
     get 
     { 
      return _imageLink; 
     } 
     set 
     { 
      _imageLink = value; 
      RaisePropertyChanged(); 
     } 
    } 

    private void RaisePropertyChanged([CallerMemberName] string name = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 

} 

それともTappedイベントを使用しているとして、あなたのXAML要素x:nameを与え、あなたのURiにその名前のイメージのソースを設定していない理由。

プロパティImageLinkを更新するには、プロパティを変更するページにCustomClassのインスタンスを作成する必要があります。

CustomClass ab = new CustomClass();

ab.ImageLink = "code here";

+0

私はINotifyPropertyChangedを試します。私は "x:name"をフライアウトと呼ばれるデータ型の中にあるので使えません。私はそれを試しましたが、コードの中にその名前を見つけることさえできません。 – zachboy82

+0

ええ、私は 'datatemplates'を使って作業しましたが、これは本当です。その場合、INotifyPropertyChangedはあなたの方法です。 – Ahmar

+0

[CallerMemberName]は、変更を開始する関数の名前です。しかし、プロシージャ自体を処理するので、それを心配する必要はありません。 – Ahmar

関連する問題