用于TextBox的Silverlight FileInfo DataContext

时间:2011-09-10 07:15:49

标签: .net silverlight

我在silverlight中有一个文本框,定义如下。

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

我的viewmodel有一个名为FileInfo的{​​{1}}对象。而且,我在文本框旁边有一个HedFileInfo,点击后会启动Button,如下所示

OpenFileDialog

我正在做这一切,因为Silverlight不允许我访问所有路径(网络驱动器等) 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; } 中的FullName。如果我只是将OpenFileDialog中的string绑定到ViewModel,我将无法获得字符串中的完整路径。 TextBox文本绑定到TextBox字段,但是当我在按钮单击事件中设置DataContext时,视图模型中的FileInfo不会更新 这有意义吗?

1 个答案:

答案 0 :(得分:0)

我认为你自己找到了正确的答案。如果希望在修改HedFileInfo属性时更改Source对象(DataContext)上的属性,则需要将绑定模式更改为TwoWay。这是完全正常的以及它应该如何工作。

考虑最基本的绑定: -

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

此代码已为其TextBox依赖项属性TextProperty对象设置了绑定。每当Description属性更改时,此绑定都会将Description的值分配给TextBox.Text属性。但是,还有另外两种方法可以设置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属性来响应。