2013-12-16 3 views
0

사용자 정의 textBox에 대해 ViewModel을 구현하려고합니다. 이것은 처음으로 this tutorial과 같은 ViewModel을 수행하는 것입니다.WPF TextBox with ViewModel

파일 탐색기 응용 프로그램에는 사용자 지정 TextBox "ExploreAddress"에 대한 주소를 보유하는 string address; (컬렉션이 아님)이 하나만 있습니다.
이 사용자 정의 텍스트 상자는 텍스트와 이미지가 (현재 디렉토리에 대한 아이콘을 그리고 정적되지 않습니다)

enter image description here

public class ExploreAddressVM : INotifyPropertyChanged 
{ 
    private string _text; 
    private System.Windows.Media.ImageSource _image; 

    public string Text 
    { 
     get { return _text; } 
     set { _text = value; } 
    } 
    public System.Windows.Media.ImageSource Image 
    { 
     get { return _image; } 
     set { _image = value; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

XAML :

<UserControl.DataContext> 

    <l:ExploreAddressViewModel/> 

</UserControl.DataContext> 

<TextBox x:Name="txtAddress" Margin="34,5,32,0" TextWrapping="Wrap" 
Text="{Binding Name}" Height="25" 
VerticalAlignment="Top" FontWeight="Bold" MinHeight="25" MaxHeight="25"> 
      <TextBox.Background> 
       <ImageBrush ImageSource="{Binding Image}" Stretch="None"/> 
      </TextBox.Background> 
     </TextBox> 

이 결합 할 수있는 이상적인 솔루션입니다 사용자 정의 된 TextBox가있는 ViewModel

정가 :

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     exploreAddress = (ExploreAddressViewModel)base.DataContext; 
     exploreAddress.Text = "My Computer"; 
    } 
    private void GoButton_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(txtAddress.Text); 
    } 

답변

2

사실은 왜 어쩌면 내가

당신은 할 필요가 없습니다 같은 ExploreAddressViewModel 클래스에 넣을 수 ExploreAddress의 클래스를 생성해야합니까 확실하지 않다 .

중복 콘텐츠가 있습니다. 클래스를 삭제하십시오.

또한

, 재산 세터 지금처럼 PropertyChanged 이벤트를 발생합니다

public class ExploreAddressViewModel : INotifyPropertyChanged 
{ 
    private string _name 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 

    private ImageSource _image; 
    public ImageSource Image 
    { 
     get { return _image; } 
     set 
     { 
      _image = value; 
      RaisePropertyChanged("Image"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

를 내가 이런 식으로 한, 텍스트 상자가 비어, 나는 텍스트 상자 @murhaf 코드 –

+0

배후에 바인딩과 질문을 업데이트 ViewModel의'Name' 속성이지만 코드가'Text' 속성을 할당하고 있습니다. 어느 것이 옳은가요? –

+0

미안 해요. 속성 이름을 텍스트로 변경했지만 질문에서 업데이트하지 않았습니다. 여전히 'Name'이라고 생각합니다. –