我有一个ListBox
绑定到ViewModel上的子集合.列表框项基于父ViewModel上的属性在datatemplate中设置样式:
<Style x:Key="curveSpeedNonConstantParameterCell">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified,
ElementName=someParentElementWithReferenceToRootDataContext}"
Value="True">
<Setter Property="Control.Visibility" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
我收到以下输出错误:
System.Windows.Data Error: 39 : BindingExpression path error:
'CurveSpeedMustBeSpecified' property not found on
'object' ''BindingListCollectionView' (HashCode=20467555)'.
BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified;
DataItem='Grid' (Name='nonConstantCurveParametersGrid');
target element is 'TextBox' (Name='');
target property is 'NoTarget' (type 'Object')
Run Code Online (Sandbox Code Playgroud)
因此,如果我将绑定表达式更改为"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
它可以工作,但只要父用户控件的datacontext是a BindingListCollectionView
.这是不可接受的,因为用户控件的其余部分会自动绑定到CurrentItem
on的属性BindingList
.
如何在样式中指定绑定表达式,以便无论父数据上下文是集合视图还是单个项目,它都可以工作?
我们有一个带有标准MVVM模式的WPF应用程序,利用Cinch(以及MefedMVVM)进行View - > ViewModel解析.这很好用,我可以将相关控件绑定到ViewModel上的属性.
在特定的视图中,我们有一个Infragistics XamGrid.此网格绑定到ViewModel上的ObservableCollection,并显示相应的行.但是,我在这个网格上有一个特定的列,我试图将TextBox文本值绑定到父DataContext上的属性,而不是ObservableCollection.这种绑定失败了.
我们在这里经历了几个选项,包括:
使用AncestorType跟踪树并绑定到父UserControl的DataContext,如此(从这个问题的答案很好,以及这个)...
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
Run Code Online (Sandbox Code Playgroud)指定ElementName并尝试直接定位顶级控件.有一个看看这里,如果你想了解使用的ElementName.
使用UserControl资源中定义的"代理"FrameorkElement尝试根据需要"传入"上下文.我们将元素定义如下,然后作为静态资源引用...
<FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
Run Code Online (Sandbox Code Playgroud)在这种情况下,绑定会找到FrameworkElement,但不能访问除此之外的任何内容(指定Path时).
阅读之后,很可能这是由树外的Infragistics XamGrid构建列引起的.但是,即使是这种情况,至少应该选择2或3.
我们最后的想法是它与V-VM绑定有关,但即使使用Snoop,我们还没有找到确切的问题.我绝不是WPF绑定的专家所以任何指针都会受到赞赏.
编辑:我在这里找到了一些来自Infragistics的模板示例,我将尝试.
编辑2:正如@Dtex所指出的,模板是可行的方法.以下是与XamGrid一起使用的相关代码段:
<ig:GroupColumn Key="CurrentDate">
<ig:GroupColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTemplate>
</ig:GroupColumn.HeaderTemplate>
<ig:GroupColumn.Columns>
Run Code Online (Sandbox Code Playgroud)
我已经打开了XML ...你只需要添加你想要的列,然后关闭相关的标签.
我有银色问题我用了两天时间来打架:带有样式的模板控制按钮.在具体按钮中,我有一个以路径为内容的画布.问题是我希望路径填充颜色从模板中的ContentControl绑定到Foreground.
但是,我还没弄清楚如何构造绑定以获取Forground.如果我愿意,例如使用TextBlock,它将自动从Style中获取Forground颜色.正如预期的那样,文本具有前景色.绑定的原因是动画控制着forground,我希望它传播到路径的填充颜色.有任何想法吗?
该模板包含以下内容:
<Style x:Key="PathButtonStyle" TargetType="Button">
... Animations and state stuff
<Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" >
<ContentControl x:Name="ContentContainer"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</Border>
</Style>
Run Code Online (Sandbox Code Playgroud)
在我的布局中,我有以下内容:
<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" >
<Canvas x:Name="PlayIcon">
<Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z"
Fill="{PATH TO CONTENTCONTROLS FOREGROUND}" />
</Canvas>
</Button>
Run Code Online (Sandbox Code Playgroud)
我已经清理了代码并删除了一些内容以使其更具可读性,但我希望你能够了解它背后的想法.
有什么办法可以将Command与DataGridHyperlinkColumn相关联吗?我试过这个:
<DataGridHyperlinkColumn Header="Client Name" Binding="{Binding ShortName}">
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Hyperlink.Command"
Value="{Binding DataContext.NavigateToClientCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ClientsSummaryView}}}"/>
<Setter Property="Hyperlink.CommandParameter" Value="{Binding}"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
Run Code Online (Sandbox Code Playgroud)
在运行时,我可以看到正在正确评估绑定(调用Command的属性getter),但是当我单击超链接时不执行Command.有一个更好的方法吗?
谢谢,
丹尼尔
当你在wpf中有一个usercontrol时,它可以到达其父元素的外部吗?例如,我的用户控件只列出了控件内部的一些通用的东西,它们被封装在主窗口的dockpanel中,但是我在主窗口中有一个文本框和按钮,我想从控件中访问...这可能吗?
这将节省我很多时间,而不是改变整个窗口的内容,并在每个用户控件中显示相同的文本框/按钮.如果有人有这方面的例子,我将不胜感激.
从概念上讲,通过从给定的叶子节点(而不是根节点)开始并使用父指针到达根目录,可以在其中遍历它的树吗?
我问这个,因为我看到有人实现了一个树,他们使用一个数组来保存所有叶子节点/外部节点,每个叶子/外部节点只指向它们的父节点,而那些父节点指向它们的父节点等等.你到达没有父母的根节点.因此,它们的实现将要求你从其中一个叶子开始到达树中的任何地方,并且你不能"下"树,因为她的树节点没有任何子指针,只有父指针.
我发现这个实现很有趣,因为我没有看到类似的东西,但我很好奇它是否仍然可以被视为"树".我从来没有见过一棵树,你开始遍历叶子,而不是根.我也从未见过一棵树,其中树节点只有父指针而没有子指针.
我有一个带有TextBlock的自定义控件:
<Style TargetType="{x:Type local:CustControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustControl}">
<Border Background="Blue"
Height="26"
Width="26" Margin="1">
<TextBlock x:Name="PART_CustNo"
FontSize="10"
Text="{Binding Source=CustControl,Path=CustNo}"
Background="PaleGreen"
Height="24"
Width="24"
Foreground="Black">
</TextBlock>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
此自定义控件具有依赖项属性:
public class CustControl : Control
{
static CustControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustControl), new FrameworkPropertyMetadata(typeof(CustControl)));
}
public readonly static DependencyProperty CustNoProperty = DependencyProperty.Register("CustNo", typeof(string), typeof(CustControl), new PropertyMetadata(""));
public string CustNo
{
get { return (string)GetValue(CustNoProperty); }
set { SetValue(CustNoProperty, value); }
}
}
Run Code Online (Sandbox Code Playgroud)
我希望在自定义控件的每个实例中,TextBlock的"Text"属性中传递"CustNo"属性的值.但我的:
Text="{Binding Source=CustControl,Path=CustNo}"
Run Code Online (Sandbox Code Playgroud)
不工作.
不适用于Path = CustNoProperty:
Text="{Binding Source=CustControl,Path=CustNoProperty}"
Run Code Online (Sandbox Code Playgroud) 我在silverlight中开发了一个包含多个子控件的用户控件.文本框,组合框等.
问题是,当我将UserControl包含到父视图中并将完整控件设置为IsEnabled = False时,仍然启用该特定UserControl中的子控件...
毕竟我发现了问题.
添加类似的东西意味着IsEnabled Binding位于用户控件绑定中,而不是我自己在父级的datacontext中所期望的.
<localControls:TeamEmployeeSelector Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
IsEnabled="{Binding CanModify}" DataContext="{Binding Confidentiality}"/>
Run Code Online (Sandbox Code Playgroud)
问题: 但是仍然存在如何将IsEnabled绑定到Parent的ViewModel的问题?因为将CanModify属性复制到Child Control的ViewModel并不是很优雅...
我有一个包含三列的DataGrid.
第三列中有一个删除按钮.它的可见性取决于名为'ControlsEnabled'的布尔属性.
DataGrid由"ObservableCollection"中的项填充.
问题是'ControlsEnabled'不是'ObservableCollection'中项目的属性,它不应该是.'ObservableCollection'是另一个类的属性.
问题:我应该如何更改我的XAML描述以解决我的问题?
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=field1}"
Width="140"
Header="head1"/>
<DataGridTextColumn Binding="{Binding Path=field2}"
Width="140"
MinWidth="50"
Header="head2"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Padding="5"
Click="DeleteButton_Click"
Tag="{Binding}"
Content="X"
Visibility="{Binding Path=ControlsEnabled, Converter={StaticResource boolToVisibilityConverter}}">
<Button.ToolTip>
<TextBlock>
Delete
</TextBlock>
</Button.ToolTip>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我的目标是将 XAML 中的元素属性绑定到类背后代码的属性,而 DataContext 仍然是 ViewModel。
原因是,我在 XAML 中有一些唯一的 UI 装饰属性,这些属性不是由 ViewModel 控制而是由后面的代码控制。
所以基本上我搜索类似的东西:
<Element
Attribute = "{Binding ThatOneCodeBehind.WhateverProperty}"
OtherAttribute1 = "{Binding StillDataContextSomething}"
OtherAttribute2 = "{Binding StillDataContextSomething}"
/>
Run Code Online (Sandbox Code Playgroud)
正确的绑定语法是什么Attribute="{Binding ThatOneCodeBehind:WhateverProperty}"
?
wpf ×7
c# ×5
data-binding ×4
xaml ×4
.net ×2
silverlight ×2
binding ×1
code-behind ×1
command ×1
datagrid ×1
datatemplate ×1
mvvm-light ×1
tree ×1
wpftoolkit ×1