【发布时间】:2015-01-20 11:48:40
【问题描述】:
我在一个网格中有两个控件。
<TextBlock Text="{Binding Name}" TextAlignment="Center" />
<TextBox Visibility="{Binding ElementName=EditMode,Source={Binding RelativeSource=
{RelativeSource FindAncestor, AncestorType={x:Type Window}}},
Converter={StaticResource BoolToVis}}" Text="{Binding Name}"
TextAlignment="Center" />
我正在尝试实现类似可编辑/不可编辑的行为。我知道我可能会选择 TextBox 并简单地更改 IsEditable 属性,但在我的场景中,我仍然需要 DataContext,至少我是这么想的。
在我的示例中,TextBlock 工作正常,TextBox 上的 Text 属性也工作正常,但对于 Visibility 部分,我想绑定到某个其他层上的数据属性( EditMode 是一个布尔值)。有没有办法将 DataContext 更改为此,但仅适用于 Visibility ? Text 属性应保持原样。
我是否应该尝试破解,定义一个不可见的复选框,在单击我的编辑按钮时更改 IsChecked 并直接绑定到该复选框?我会试试这个。我认为这样,不需要更改 DataContext。
【问题讨论】:
-
为什么不把
EditMode属性放到当前数据上下文中? -
<TextBox Visibility="{Binding ElementName=EditMode, Converter={StaticResource BoolToVis}}" />怎么样 -
@Denis,如果我把它放在那里,我将进行一些集合迭代,以便在单击“编辑”按钮时更改它。这就是为什么我试图将它保持在更高的水平,这意味着在我的窗口的数据上下文中。
-
@rraszewski 通过这样做,我使用了错误的数据上下文,即用于 Text 属性的数据上下文。
-
遵循 MVVM 将使结构更加清晰:视图模型(数据内容事物)应该提供通用视图能够表示数据的所有必要属性。如果您缺少一个,那么只需添加它。您可以将属性
Name绑定到TextBlock.Text和属性IsNameEditable(或其他)用于Visibility。最后一个甚至可以是Visibility类型,以避免有转换器的必要性。这样,您将拥有相同 data-content 中的所有属性 - 没问题。