2011-09-10 9 views
1

私は以下のように定義されたシルバーライトのテキストボックスを持っています。Silverlight FileInfo TextBox用のDataContext

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

私のviewmodelはHedFileInfoと呼ばれるFileInfoを目的としています。そして、私は、クリック、テキストボックスの横にButtonを持って

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

シルバーdoesntのは、私はすべてのパス(ネットワークドライブなど)のためにOpenFileDialogFullNameにアクセスできますので、私はこのすべてをやっているし、次のようにOpenFileDialogを起動します。私がちょうどViewModelstringTextBoxに縛っても、その文字列の完全なパスを得ることはできません。 TextBoxテキストはNameフィールドにバインドされますが、ボタンクリックイベントでDataContextを設定すると、ビューモデル内のFileInfoは更新されません。 これは意味がありますか?

+0

Ok ...あなたの質問は何ですか? –

+0

意味がありますか?それは動作しないため。 – Aks

答えて

0

あなたは自分自身で正しい答えを得たと思います。 DataContextプロパティが変更されたときにSourceオブジェクト(HedFileInfo)のプロパティを変更する場合は、バインディングモードをTwoWayに変更する必要があります。これは完全に正常で、どのように動作するはずです。

は、バインディングの最も基本的なを考えてみましょう: -

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

このコードは、そのTextProperty依存properyためTextBoxオブジェクトのバインディングを設定しました。 Descriptionプロパティが変更されるたびに、このバインディングはDescriptionという値をTextBox.Textプロパティに割り当てます。ただし、Textプロパティを設定する2つの方法があります。ユーザーは、現在存在するものを入力することができ、コードはTextプロパティに値を割り当てることができます。したがって、プロパティはDescriptionとは異なる値を持つ可能性があります。デフォルトのOneWayモードでは、ソースオブジェクトのDescriptionプロパティは変更されません。ユーザーが新しいテキストまたはコードを直接Textプロパティを変更するバインディングは現在、ソースオブジェクトにDescriptionプロパティを更新することで応答します出るたび

<TextBox Text="{Binding Description, Mode-TwoWay}" /> 

- :

は今すぐに変更します。

DataContext性とその結合は、正確に同じように振る舞います。有する: -

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

ソースビューモデルにおけるHedFileInfo変化(INotifyPropertyChangedが実装されていると仮定して)の値は、次にDataContextの値が変更されるたびに。コードを直接DataContextの値を変更する結合(OneWayモードである)しかし、ソース・ビュー・モデルを更新しません。

これに変更し、それを: - あなたはそれがしたいよう

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

とは、今では動作します。コードがDataContextの値を直接変更すると、バインディングはソースビューモデルのHedFileInfoプロパティを更新することによって応答します。

+0

ありがとうございます。これはmvvmのopenfiledialogを扱うための受け入れ可能な方法ですか? – Aks

+1

@Aks:個人的に私はMVVMを使用するためのルール作成が嫌いです。実際の問題は、ユニットテストを使用する場合、このテスト可能でない場合、妥当な選択肢(FileInfoでは扱いにくい可能性があります)があるかどうかです。 MVVMがデザイナー/開発者の分離をサポートするために使用されている場合、デザイナーはこの必要なコードに反対します(FileInfoの取得にはあまり選択肢がありません)。それは個人的に、 'SelectedFile'依存プロパティを持つ新しい' FileDialogBu​​tton'コントロールを作成する傾向があると言いました。そうすれば、ビューは特別なコードを 'FileDialogBu​​tton'に必要とせず、バインディングも簡単になります。 – AnthonyWJones

関連する問題