2012-03-07 15 views
14

WPFとCaliburn.Microの両方のカーブが比較的低いです。コンボボックス選択値にビューモデルのcaliburn.microバインディングを行う方法?

ここでの目標は、コンボボックスの選択項目のバインディングを、シェルビューのコードからビューモデルに移動することです。コンボボックスの項目コレクションの場合と同じです。

XAML:の後ろ

<Window x:Class="EomDatabaseUtility.Views.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Eom Tool Database Utility" Height="350" Width="525"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="258" HorizontalAlignment="Left" Margin="12,41,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" /> 
     <Button Content="Execute" Height="23" HorizontalAlignment="Left" Margin="416,12,0,0" VerticalAlignment="Top" Width="75" x:Name="Execute" /> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="120" x:Name="CatalogName" SelectedValuePath="{Binding Path=SelectedCatalogName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</Window> 

コード(目標は、私が正しくuderstand場合、任意のコードを追加する必要がないことです)。

namespace EomDatabaseUtility.Views 
{ 
    using System.Windows; 

    public partial class ShellView : Window 
    { 
     public ShellView() 
     { 
      InitializeComponent(); 
     } 

     // --> This should go in the view model, Right? 
     private string selectedCatalogName; 
     public string SelectedCatalogName 
     { 
      get { return selectedCatalogName; } 
      set { selectedCatalogName = value; } 
     } 
    } 
} 

ビューモデル(現在コンボボックスにアイテムのコレクションを提供すると共にボタンイベントハンドラを提供します):

あなたのComboBoxのCatalogNameの名前を持っているので、Caliburn.Micro規則が探します、実際には

<ComboBox x:Name="CatalogName" ... SelectedItem="{Binding SelectedCatalog}" /> 

public class ShellViewModel : PropertyChangedBase 
{ 
    private string selectedCatalog; 

    public List<string> CatalogName 
    { 
     get 
     { 
      return new List<string> { "foo", "bar" }; 
     } 
    } 

    public string SelectedCatalog 
    { 
     get 
     { 
      return this.selectedCatalog; 
     } 

     set 
     { 
      this.selectedCatalog = value; 
      this.NotifyOfPropertyChange(() => this.SelectedCatalog); 
     } 
    } 

namespace EomDatabaseUtility.ViewModels 
{ 
    using Caliburn.Micro; 
    using System.Collections.Generic; 

    public class ShellViewModel : PropertyChangedBase 
    { 
     public List<string> CatalogName 
     { 
      get 
      { 
       return new List<string> { "foo", "bar" }; 
      } 
     } 

     public void Execute() 
     { 
      System.Windows.MessageBox.Show("hello"); 
     } 
    } 
} 

答えて

34

あなたはあなたのビューモデルのプロパティにComboBoxSelectedItemをバインドすることができますSelectedCatalogName(またはActiveCatalogName)というプロパティを使用して、ComboBoxSelectedItemを自動的にバインドするので、使用することができます:

<ComboBox x:Name="CatalogName" ... /> 

public string SelectedCatalogName 
{ 
    ... 
} 

注意すべきいくつかのこと:

  • 我々はSelectedCatalog用セッターでNotifyOfPropertyChange()を呼び出します。これは、UIが更新されるように、ビューモデルから値を設定するたびに値が変更されたことをUIに通知します。このメソッドはPropertyChangedBaseの一部です。
  • 実際には、WPFに付属のObservableCollectionや、Caliburn.MicroのBindableCollection(Caliburn.MicroのIObservableCollectionを実装している)など、ビューモデルのコレクション変更通知をサポートするコレクションタイプを使用する必要があります。これにより、オブジェクトがビューモデルからコレクションに追加/削除されたときにUIに通知することができます。
  • ライフサイクル(アクティブ化/非アクティブ化など)がある場合や、現在アクティブなアイテム(画面)が変更される場合は、ScreenまたはConductorタイプ(PropertyChangedBaseではなく)を実装する必要があります。実行時間。
+0

ありがとう!しかし、SelectedCatalogNameではなく、SelectedItemプロパティを使って作業していますが、これは単なるボーナスです... –

+2

ああ、コンボボックスのCatalogNamesの名前を付けてから、CatalogNamesプロパティとSelectedCatalogNameを試してみてください。私はそれが働くことを期待します。 – devdigital

+2

うん、それはそれをやった..私は好き! –

関連する問題