2010-11-18 22 views
2

'da xaml'yi dinamik olarak güncelleştirmek için bir Model'den bir olayı nasıl ele alabilirim Bunu anlamaya çalışırken bir bit ucu çıktım ... WPF'deki MVVM desenini kullanarak, C# Modelimiz Bir şeyler olduğunu söylemek için bir olay başlatır. Bu olayı ViewModel'imde halledebilirim ve ardından bir storyboard'u tekmelemek veya mevcut Xaml Sayfasında gizli bir panelin görünürlüğünü değiştirmek istiyorum. Bunun arkasında hiçbir kod bulunmamak gerekiyor.WPF: MVVM

ViewModel'imdeki olay için senkronizasyon yapabilir, bir etkinliğin adını söyleyerek bir olayı güncelleyebilir ve bir NotifyPropertyChanged'i tetikleyebilirim; ancak bunu bir storyboard'u veya bir boolean true'yu eşleştirmek için nasıl yapabilirim? Kılavuzumun Görünürlük özelliği üzerinde yanlış mı? Farklı ızgaralar olarak olay adı olarak hs'ye bağlandığım özellik, farklı olaylara dayanarak gösterilebilir, bu yüzden bunu bir boole'ye eşleme yöntemine ihtiyacım var. Ancak ideal çözüm, bir storyboard başlatmak olabilir. DataTriggers'a baktım ama hepsi gerçek sayfalara değil stillere bağlı görünüyor.

Bunu nasıl başarabileceğime dair bir fikriniz var mı?

Teşekkürler!

cevap

0

Görünür özelliğini, ızgaradaki Xaml'de ViewModel'inizin boolean özelliğine bağlayın.

<Grid Visibility="{Binding Path=VisiblePropertyOnViewModel}"> 

Artık ViewModel'inizde gerekenleri yapın ve özelliği ayarlayın. INotifyPropertyChanged veya bir DependencyProperty olduğu sürece, çalışır.

Bir Storyboard'u nasıl başlatacağınızı anlamak için daha fazla kazma yapmak zorundayım, ama hiç şüphem yok ki neredeyse kolay olacaktır. Storyboard'lar da inanıyorum PropertyTriggers tarafından atılabilir. Başlaman için bunu bırakacağım.

+0

Cevabınız için teşekkürler Dave - gerçekten takdir ediyorum! Problem bu özellik bir bool değil. Bu bir ip Temel olarak, meydana gelebilecek bir sürü olay var (yüzlerce kişi!). Bu yüzden, bu yazıyı gevşek bir şekilde yazıp Xaml'ın bir çeşit yapmasına izin vermeyi düşünüyorum: - böylece ifade doğru olarak değerlendirilir ve bu Görünürlük'ü true olarak ayarlar ... – Slippy

+0

Görünürlük 3 olası değere sahip, bunu bir boole'ye bağlamak için bir dönüştürücüye ihtiyacınız olacak ve doğru/yanlış olanı seçin Daraltılmış/Gizli/Görünür anlamına gelir. – Matthieu

+0

Cheers Matthieu - Sonsuz sınırsız bir etkinlik listesine sahip olduğum için bir çeviriciden kaçınmayı umuyordum. Herhangi bir İfade Değerlendirme yapmak istiyorsanız, Çeviriciler kullanılmalıdır? – Slippy

1

ben kod arkasında

Storyboard animation = (Storyboard)this.FindResource("ShowPanelStoryboard"); 
animation.Begin(); 

Bu kod değil ViewModel, Görünüm arkasında gider bir film şeridi başlaması geçmişte bu yöntemi kullandık. Şahsen, sadece View ile ilgili olduğunu sağlayarak View'imin arkasındaki bazı kodları umursamıyorum. Bunu kullandım projede, VisibilityChanged etkinliğine bir dinleyici ekledim ve Visible olarak değiştirildikten sonra, storyboard'u çalıştırdım.

Pop-up'ınızı göstermeye gelince, birkaç yol var. Favorilerimden biri, ViewModel'e IsPopupShown özelliğini eklemek, panelimin görünürlüğünü ona bağlamak ve her zaman açılır pencerenin gösterilmesi gerektiğinde bunu true olarak ayarlamaktı. ViewModel daha sonra görüntülenen açılır pencereyi tetikleyen olayları işler.

Dave White tarafından önerilen alternatif bir dönüştürücü kullanmaktır. Değeriniz her zaman doğru/yanlış değilse, bir bağlanan değerin ConverterParameter değerine eşit olup olmadığını kontrol eden ve bir Görünürlük değerini döndüren bir dönüştürücü oluşturabilirsiniz.

+0

Teşekkürler Rachel - sadece burada sorunum var hiç kodum yok. Ben sadece gevşek Xaml ile çalışıyorum: (Bu işe yarayıp yaramadığını görmek için Convertor rotasına bir göz atacağım. Cevabınız için teşekkürler .. Gerçekten teşekkürler! – Slippy

1

Yaptığınız yorumdan bana, görünüş modelinizdeki türündeki object mülkünü açığa çıkarmak istediğinizi sevdiğim görülüyor. Görünüm modeli bir olay aldığında, o olay için uygun olan bir nesneye Event ayarlar. XAML olarak, bu var:

<ContentControl Content="{Binding Event}"/> 

ve kaynak sözlükte

görüntülemek istediğiniz olayın her özel türü için DataTemplate tanımlar. Event boşsa, hiçbir şey görüntülenmez. Event, DataTemplate için tanımladığınız bir nesne içeriyorsa, bu şablon kullanılarak görüntülenir.

Evet, her olay türü için bir sınıf oluşturmanız gerekir (zaten yoksa).

başka yolu da yoksul adamın şablon seçici uygulamaktır:

<TextBlock Text="This is displayed if Foo contains 'BAR'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAR"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
<TextBlock Text="This is displayed if Foo contains 'BAZ'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAZ"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

O, ancak karşılıklı münhasır ekran seçenekleri bir sürü taşıma için kolay bir yol tür aptalca ayrıntılı var oluyor.

+0

Teşekkürler Robert - bu tamamen mantıklı geliyor. hile yapıp yapmadığını görmek için örnek üzerinden. Cevabınız için teşekkürler! – Slippy