2011-09-10 45 views
1

我在Silverlight中有一個文本框,其定義如下。Silverlight FileInfo TextContext的DataContext

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

我的視圖模型有一個名爲HedFileInfo一個FileInfo對象。而且,我有文本框,點擊後,啓動OpenFileDialog如下

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

我做這一切都是因爲Silverlight的犯規讓我訪問FullNameOpenFileDialog所有路徑旁Button(網絡驅動器等) 。如果我只將中的string綁定到TextBox,我將無法獲得字符串中的完整路徑。 TextBox文本綁定到Name字段,但是當我在按鈕單擊事件中設置DataContext時,ViewModel中的FileInfo未更新 這是否有意義?

+0

好的......現在你的問題是什麼? –

+0

它有道理嗎?因爲它不工作。 – Aks

回答

0

我想你自己已經找到了正確的答案。如果要在修改DataContext屬性時更改源對象(HedFileInfo)上的屬性,則需要將綁定模式更改爲TwoWay。這是非常正常的,它應該如何工作。

考慮最基本的綁定: -

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

該代碼已經爲它的TextProperty依賴屬性格式的TextBox對象上的約束力。每當Description屬性發生更改時,此綁定將爲TextBox.Text屬性分配值Description。但是還有另外兩種方法可以設置Text屬性。用戶可以鍵入當前的內容,或者代碼可以爲Text屬性賦值。因此,TextBox.Text屬性可能與Description具有不同的值。在默認的OneWay模式下,源對象上的Description屬性未被修改。

現在改爲: -

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

當用戶輸入新的文本或代碼修改Text屬性直接綁定現在將源對象上更新Description財產作出迴應。

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

相關問題