【问题标题】:Silverlight FileInfo DataContext for TextBox文本框的 Silverlight FileInfo 数据上下文
【发布时间】:2011-09-10 19:38:06
【问题描述】:

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

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

我的视图模型有一个名为HedFileInfoFileInfo 对象。而且,我在文本框旁边有一个Button,单击它时会启动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 不允许我访问 OpenFileDialog 中的 FullName 的所有路径(网络驱动器等)。如果我只是将ViewModel 中的string 绑定到TextBox,我将无法获得字符串中的完整路径。 TextBox 文本绑定到 Name 字段,但是当我在按钮单击事件中设置 DataContext 时,视图模型中的 FileInfo 没有更新 这有意义吗?

【问题讨论】:

  • 好的...现在你的问题是什么?
  • 有意义吗?因为它不起作用。

标签: .net silverlight


【解决方案1】:

我认为您自己已经得出了正确的答案。如果希望在修改DataContext 属性时更改源对象(HedFileInfo)上的属性,则需要将绑定模式更改为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 属性来响应。

【讨论】:

  • 谢谢。这是在 mvvm 中处理 openfiledialog 的可接受方式吗?
  • @Aks:我个人不喜欢为使用 MVVM 制定规则。真正的问题是,如果使用单元测试是否可以测试,是否有合理的替代方案(使用 FileInfo 可能会很棘手)。如果使用 MVVM 来支持设计器/开发器分离,那么设计器是否反对这种必要的代码(在获取 FileInfo 时您没有太多选择)。也就是说,我个人倾向于创建一个具有 SelectedFile 依赖属性的新 FileDialogButton 控件。这样视图就不需要FileDialogButton 中的特殊代码,并且绑定更简单。
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多