2011-09-10 2 views
1

다음과 같이 정의 된 silverlight 텍스트 상자가 있습니다.Silverlight FileInfo TextBox 용 DataContext

<TextBox x:Name="hedtextBox" DataContext="{Binding HedFileInfo}" Text="{Binding Name}" Width="100" Grid.Column="1" Margin="2,0,2,0" /> 

내 뷰 모델은 HedFileInfo라는 FileInfo 개체가 있습니다. 그리고, 나는 클릭하면 실버 나 모든 경로에 대한 OpenFileDialogFullName에 액세스 할 수 나던 때문에이 모든 일을 해요

private void HedBrowseButtonClick(object sender, RoutedEventArgs e) 
    { 
     var ofd = new OpenFileDialog { Filter = "CSV Files (.csv)|*.csv" }; 
     var result = ofd.ShowDialog(); 
     // Process open file dialog box results 
     if (result != true) return; 
     hedTextBox.DataContext = ofd.File; 
    } 

을 다음과 같이의 OpenFileDialog을 시작하는 텍스트 상자 옆에 Button이 (네트워크 드라이브 등) . 그리고 ViewModel에있는 stringTextBox에 묶는다면 문자열에서 전체 경로를 가져올 수 없습니다. TextBox 텍스트는 Name 필드에 바인딩되지만 단추 클릭 이벤트에서 DataContext를 설정하면 viewmodel의 FileInfo가 업데이트되지 않습니다. 의미가 있습니까?

+0

Ok ... 이제 귀하의 질문은 무엇입니까? –

+0

의미가 있습니까? 그것 때문에 작동하지 않습니다. – Aks

답변

0

나는 당신이 정답을 찾아 왔다고 생각합니다. DataContext 속성을 수정할 때 원본 개체의 속성 (HedFileInfo)을 변경하려면 바인딩 모드를 TwoWay으로 변경해야합니다. 이것은 완벽하게 정상적으로 작동하는 방식입니다.

<TextBox Text="{Binding Description}" /> 

이 코드는 그 TextProperty 종속 때에 프로퍼티의 TextBox 객체에 바인딩을 설정하고있다 : -

는 바인딩의 가장 기본을 고려하십시오. Description 속성이 변경되면이 바인딩은 Description 값을 TextBox.Text 속성에 할당합니다. 그러나 Text 속성을 설정하는 두 가지 다른 방법이 있습니다. 사용자는 현재있는 내용을 입력하거나 코드에서 Text 속성에 값을 지정할 수 있습니다. 따라서 속성은 Description과 다른 값을 가질 수 있습니다. 기본 OneWay 모드에서는 원본 개체의 Description 속성이 수정되지 않습니다.

지금 변경합니다 : -
<TextBox Text="{Binding Description, Mode-TwoWay}" /> 

사용자가 새 텍스트를 입력하거나 코드를 직접 지금 소스 객체에 Description 속성을 업데이트하여 응답 바인딩 Text 속성을 수정 할 때마다

.

DataContext 속성 및 바인딩은 정확히 동일한 방식으로 동작합니다. 함께 -

소스 뷰 모델 HedFileInfo 변화 값 ( INotifyPropertyChanged 가정이 구현된다)마다
<TextBox DataContext="{Binding HedFileInfo}" Text="{Binding Name}" /> 

DataContext 다음의 값이 변경된다. 그러나 코드가 DataContext 값을 직접 수정하면 (OneWay 모드에 있음) 소스 뷰 모델이 업데이트되지 않습니다.

이로 변경을 : - 당신이에 원하는만큼

<TextBox DataContext="{Binding HedFileInfo, Mode=TwoWay}" Text="{Binding Name}" /> 

그리고 지금은 작동합니다.코드가 DataContext 값을 직접 변경하면 바인딩은 원본 뷰 모델의 HedFileInfo 속성을 업데이트하여 응답합니다.

+0

감사합니다. 이것은 mvvm에서 openfiledialog를 다루기에 적합한 방법입니까? – Aks

+1

@Aks : 개인적으로 MVVM을 사용하기위한 규칙 작성을 좋아하지 않습니다. 진짜 질문은 Unit Tests를 사용하는 것이 합당한 대안 (FileInfo가 까다로울 수 있음)이 없다면 테스트 할 수 있다는 것입니다. MVVM이 디자이너/개발자 분리를 지원하는 데 사용되는 경우 설계자는이 필수 코드에 반대합니다 (FileInfo를 얻는 데 많은 선택권이 없습니다). 그건 개인적으로'SelectedFile' 의존성 프로퍼티를 가진 새로운'FileDialogButton' 컨트롤을 만드는 경향이 있다고 말했습니다. 그런 식으로보기는 특별한 코드를'FileDialogButton'에 쓸 필요가없고 바인딩이 더 간단합니다. – AnthonyWJones