我在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不会更新
这有意义吗?
答案 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
属性来响应。