2012-03-07 2 views
14

저는 WPF와 Caliburn.Micro의 곡선이 비교적 작습니다.보기 모델을 선택한 값으로 콤보 박스에 caliburn.micro 바인딩하는 방법?

내 목표는 콤보 박스의 항목 컬렉션에 대한 것과 동일한 쉘 뷰 코드에서 뷰 모델로 콤보 박스 선택 항목의 바인딩을 이동하는 것입니다.

XAML :

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; } 
     } 
    } 
} 

보기 모델을 (: (목표 만약 내가 제대로 uderstand, 코드를 추가 할 필요가 없습니다 것입니다) 뒤에

<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> 

코드 현재 단추 이벤트 처리기뿐만 아니라 콤보 상자에 항목 모음 제공) :

당신의 ComboBoxcatalogName로의 이름이 때문에 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

감사합니다. SelectedItem 속성을 사용하지만 SelectedCatalogName은 사용하지 않습니다.하지만 어쨌든 보너스 일뿐입니다. –

+2

아, Combobox CatalogNames의 이름을 지정한 다음 CatalogNames 속성과 SelectedCatalogName을 사용해보십시오. 나는 그것이 일하기를 기대할 것이다. – devdigital

+2

옙, 그랬지 .. 나는 좋아한다! –

관련 문제