- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已将我的问题简化为一个最小的示例:我的 DataGrid 由 ControlTemplate 定义,在该 ControlTemplate 中我无法绑定(bind)到我的 ViewModel 中的任何内容。
这是简化的 ViewModel:
public class ViewModel : PropertyChangedBase
{
private string text1;
public ViewModel()
{
this.text1 = "tx1!";
}
public string Text1
{
get { return text1; }
set
{
if (value == text1) return;
text1 = value;
NotifyOfPropertyChange(() => Text1);
}
}
}
我尝试使用多种方法绑定(bind)到 Text1
。我通过 Google 找到的大多数东西都建议使用 FindAncestor
,但它也不起作用:
<Window x:Class="DataGridTemplateBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridTemplateBinding"
Title="MainWindow" Height="350" Width="525"
x:Name="LayoutRoot"
>
<Window.Resources>
<ControlTemplate x:Key="TableTemplate">
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" />
<!-- by ElementName -->
<DataGridTextColumn Header="{Binding DataContext.Text1, ElementName=LayoutRoot}" />
<DataGridTextColumn Header="{Binding Text1, ElementName=LayoutRoot}" />
<!-- by Ancestor type (Window) -->
<DataGridTextColumn Header="{Binding DataContext.Text1, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
<DataGridTextColumn Header="{Binding Text1, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
<!-- by templated parent -->
<DataGridTextColumn Header="{Binding DataContext.Text1, RelativeSource={RelativeSource TemplatedParent}}" />
<DataGridTextColumn Header="{Binding Text1, RelativeSource={RelativeSource TemplatedParent}}" />
<!-- by self?? -->
<DataGridTextColumn Header="{Binding DataContext.Text1, RelativeSource={RelativeSource Self}}" />
<DataGridTextColumn Header="{Binding Text1, RelativeSource={RelativeSource Self}}" />
<DataGridTextColumn Header="{Binding Content.DataContext.Text1, RelativeSource={RelativeSource TemplatedParent}}" />
<DataGridTextColumn Header="{Binding Content.Text1, RelativeSource={RelativeSource TemplatedParent}}" />
<DataGridTextColumn Header="{Binding DataContext.Text1}" />
<DataGridTextColumn Header="{Binding Text1}" />
<DataGridTextColumn Header="Column End" />
</DataGrid.Columns>
</DataGrid>
</ControlTemplate>
</Window.Resources>
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Grid>
<DataGrid Template="{StaticResource TableTemplate}" />
</Grid>
</Window>
模板中的列如何绑定(bind)到 ViewModel 中的任何内容?我无法想象这是不可能的。
为了完整起见,这些是记录到输出的错误。它们的顺序不与 XAML 的顺序一致。
System.Windows.Data Error: 40 : BindingExpression path error: 'DataContext' property not found on 'object' ''DataGridTextColumn' (HashCode=28365320)'. BindingExpression:Path=DataContext.Text1; DataItem='DataGridTextColumn' (HashCode=28365320); target element is 'DataGridTextColumn' (HashCode=28365320); target property is 'Header' (type 'Object')
System.Windows.Data Error: 40 : BindingExpression path error: 'Text1' property not found on 'object' ''DataGridTextColumn' (HashCode=54811268)'. BindingExpression:Path=Text1; DataItem='DataGridTextColumn' (HashCode=54811268); target element is 'DataGridTextColumn' (HashCode=54811268); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=55195297); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=38845522); target property is 'Header' (type 'Object')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=DataContext.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=2399386); target property is 'Header' (type 'Object')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=31265986); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=6837024); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=17422861); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Content.DataContext.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=32669489); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Content.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=22361045); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext.Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=7953856); target property is 'Header' (type 'Object')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Text1; DataItem=null; target element is 'DataGridTextColumn' (HashCode=65911433); target property is 'Header' (type 'Object')
最佳答案
为 DataGridTextColumn
设置 HeaderTemplate
,如下所示
<DataGridTextColumn >
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Text1}"></TextBlock>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
关于c# - 从 ControlTemplate 绑定(bind)到 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694091/
我知道必须有一个简单的答案,但我找不到。 我有一个名为 HoverButton 的按钮样式.
我有一个 NavigationMenuControl用ObservableCollection .一切正常,但是 Style在我的 HtMenuIcon不触发控制。 Visibility在哪里被正确更
我想在运行时定义一个ControlTemplate。这可能吗?我注意到ControlTemplate类的VisualTree属性。我还注意到它使用FrameworkElementFactory类。但是
使用 d:DataContext 可以轻松地为 DataContext 提供设计时数据但是用 {TemplateBinding} 引用的控件属性呢?或 {RelativeSource Template
ControlTemplate 如何处理数据上下文? 使用以下模板 与控制
假设我们有一个非常“长 XAML”ControlTemplate对于我们的Control . 我们想要只需在模板中添加 1 个按钮 . MSDN 声称“没有办法只替换控件的可视化树的一部分”。 我真的
有用的东西 我需要设置作为 StackPanel 子项的某种类型的控件的样式。我正在使用: ... ... 这很好用!每个 TextBlock
我有一个包含以下代码的 xaml 文件:
我想定义一个 ToggleButton,它在选中时以红色前景(例如)显示,而不是按下按钮的默认外观。 我看到视觉状态作为命名元素在 ToggleButton 的 ControlTemplate 中维护
我有一个 ListView,它使用 DataTemplate 呈现每个项目,每个项目都有一个编辑和删除按钮。这两个按钮是模板化的,因此它们使用 Path 来显示图标,并在鼠标悬停时使用 Storybo
....
我有一个 Telerik Tile 的 ControlTemplate,我正在覆盖如下: 我的用户控件如下所示:
我有一个按钮控制模板。我想制作圆角的按钮。我该怎么做? 我尝试使用 CornerRadius 作为边框中的按钮,但它不起作用。按钮的背景已设置为具有角边框的图像,并且按钮看起来很糟糕,因为我无法为按钮
我在 WPF 中创建了这个用户控件 当我编译这个时,我收到以下错误。 “UserControl1” ControlTemplate Tar
我有一个资源字典,其中包含我的窗口的样式。在这种风格中,我定义了模板,并在那里定义了很多东西。除其他外,我定义了一个 Storyboard来为模板中定义的某些事物制作动画。它看起来像这样:
我目前正在尝试找出如何在其他控件模板中重用模板(如标题所述)。我想做的是制作一堆按钮,它们都略有不同,但有几个相似的功能。它们都共享几个相同的图形元素,并具有处理这些图形元素的相同触发器。我希望做的是
我有一个从 slider 派生的类,它使用自定义控件模板并添加了一些依赖属性。我想根据新属性在模板中触发触发器。 例如,我有一个名为 ThumbIsVisible 的新依赖属性,当它设置为 false
我想根据控件的状态更改/动画自定义按钮控件模板的 Foreground 属性。 在 RC0 之前,我设置了 ContentPresenter 的前景,给它一个 x:Name,并在 VisualStat
我已决定尝试自定义 Menu 和 MenuItem 的默认控件模板的许多方面。在 Visual Studio 中,我选择了菜单,在属性面板中找到了"template",然后选择了“转换为新资源...”
我有一个非常大的 ControlTemplate(200 多行),里面有许多嵌套控件。我需要重用此模板,只需对其中一个嵌套控件(复选框的可见性)进行少量更改。显然,我不想复制粘贴到新的 Control
我是一名优秀的程序员,十分优秀!