我的目标是将Label的Content -Property 绑定到应用Style的Elements的Tag -Property .但我的解决方案似乎不起作用:
我的风格:
<Style
TargetType="TextBox"
x:Key="HintedTextBox">
<Style.Resources>
<VisualBrush
AlignmentX="Left"
AlignmentY="Center"
Stretch="None"
x:Key="HintedTextBox_Hint">
<VisualBrush.Visual>
<Label
Content="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"
Foreground="LightGray" />
</VisualBrush.Visual>
</VisualBrush>
</Style.Resources>
<!-- Triggers -->
</Style>
Run Code Online (Sandbox Code Playgroud)
我的文本框:
<TextBox
Style="{StaticResource ResourceKey=HintedTextBox}"
x:Name="tbTest" />
Run Code Online (Sandbox Code Playgroud) 我DataSet有义务Window.DataContext; 我还有一个DataGrid:
<DataGrid ItemsSource={Binding Tables[Items]}>
<DataGrid.Columns>
<DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
基本上,我正在尝试将该列的Header绑定到DataTable"Names",列"Test",第一行.
但是,我无法做到对.请注意,我可以在DataGrid外部绑定它.Grid的ItemsSource更改了数据上下文,我不知道如何在外部引用原始DataContext.
似乎绑定成功了; 但问题是Window.DataContext中Tables [Names]的当前项(第一行)丢失了.
如果我使DataSet静态并通过{x:Static local:dataset}访问它,那么事情就可以了.但我不能使用静态数据集,因为会有多个实例(多用户).
有谁能指出我正确的方向?
这似乎是一个非常受欢迎的话题,但......
我有以下XAML:
<internal:MyCommandObject x:Name="CommandModel"/>
<Button DockPanel.Dock="Bottom" Command="{Binding DoAction, ElementName=CommandModel}">
<Button.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Command="{Binding DoAction, ElementName=CommandModel}"/>
</ContextMenu>
</Button.ContextMenu>
Click Me
</Button>
Run Code Online (Sandbox Code Playgroud)
现在,MyCommandObject是一个从其公开动态命令的控件DataContext.你知道接下来会发生什么.:)
基本上,按钮命令工作正常 - 当我单击它时,DoAction命令就MyCommandObject完美地执行了.但是,menuitem中的命令不会被执行.我尝试过各种手段,例如设置上下文菜单datacontext是placementTarget这样它可以遍历控制等的可视化树,但没有在做.
我需要什么特定的对齐RelativeSource和CommandTarget符文才能使它工作?
是FindAncestor搜索在窗口的整体视觉树中的元素?
如果是,那么我该如何改进呢?
是binding data error,如果我们通过寻找与查找祖先与没有这样的元素存在的元素来访问对象的属性抛出?
如果是,那么我该如何解决这样的错误.
在我的情况下绑定错误抛出输出窗口.为了解决这个错误,我尝试了设置FallbackValue,但现在它给了我警告而不是错误,这是唯一的区别.其他一切都和错误一样.
谁能告诉我究竟是如何FindAncestor运作的?
这是代码:
<GridViewColumn DisplayMemberBinding="{Binding Path=BookId}" Width="100">
<GridViewColumn.Header>
<Border BorderBrush="Black">
<TextBlock Width="{Binding RelativeSource=
{RelativeSource FindAncestor,
AncestorType={x:Type GridViewColumn}},
Path=Width}" Text="ID">
<TextBlock.ContextMenu>
<ContextMenu>item1</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</Border>
</GridViewColumn.Header>
</GridViewColumn>
Run Code Online (Sandbox Code Playgroud)
基本上我要做的是使标题中的TextBlock遵循整列的宽度.
它不起作用:文本块的宽度始终与内部文本匹配.有什么想法吗?...提前致谢!
我想将属性绑定到其DataContext中具有ViewModel的父容器视图.
当父是ConcreteClassView的直接实例时,此代码非常有效:
Property="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ty:ConcreteClassView}}, Path=DataContext.Name}"
Run Code Online (Sandbox Code Playgroud)
但是,在尝试通过基类或接口找到父级时,找不到父级.样品:
PropertyB="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ty:BaseClassView}}, Path=DataContext.Name}"
PropertyB="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ty:INamedElementView}}, Path=DataContext.Name}"
Run Code Online (Sandbox Code Playgroud)
给予:
class ConcreteClassView : BaseClassView, INamedElementView { }
Run Code Online (Sandbox Code Playgroud)
好吧,我们假设FindAncestor,AncestorType需要具体类型才能工作.
但是,有什么解决方法可以根据基类或实现给定的接口来定位祖先?
Thxs.
下一个代码按预期工作:
询问窗口.xaml:
<Window
x:Class='AskWPF.AskWindow'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
>
<DataGrid ItemsSource="{Binding SimpleItems}" />
</Window>
Run Code Online (Sandbox Code Playgroud)
AskWindow.xaml.cs:
namespace AskWPF {
public class SimpleRow {
private string firstColumn;
private string secondColumn;
public SimpleRow(string first, string second) {
firstColumn = first;
secondColumn = second;
}
public string FirstColumn {
get { return firstColumn; }
set { firstColumn = value; }
}
public string SecondColumn {
get { return secondColumn; }
set { secondColumn = value; }
}
}
public partial class AskWindow : Window {
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作条形图用户控件.我正在使用a创建每个栏DataTemplate.
问题是为了计算每个条的高度,我首先需要知道它的容器的高度(TemplatedParent).不幸的是我有:
Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height, Converter={StaticResource HeightConverter}, Mode=OneWay}"
Run Code Online (Sandbox Code Playgroud)
不起作用.每次将值NaN返回到我的Converter.RelativeSource={RelativeSource TemplatedParent}在这种情况下不起作用?我还能做些什么来让我的DataTemplate与正在应用的元素"对话"?
这里有帮助,这是准系统DataTemplate:
<DataTemplate x:Key="BarGraphTemplate">
<Grid Width="30">
<Rectangle HorizontalAlignment="Center" Stroke="Black" Width="20" Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height, Converter={StaticResource HeightConverter}, Mode=OneWay}" VerticalAlignment="Bottom" />
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) 我使用的结合RelativeSource与FindAncestor模式,但不正常的约束力.我如何调试并查看它是否能够找到祖先?
我有一个绑定到对象的ItemsControl,在ItemsControl的数据模板中,我有两个文本块,我想将第一个文本块的text属性绑定到位于此ItemsControl之外的另一个文本块。
我尝试在父datacontext中查找对象,也尝试使用Path = Text查找TextBlock
下面是一个示例:
<TextBlock Name="Name" Text="{Binding Name}"
Grid.Column="0"
FontSize="{DynamicResource SmallSize}"
TextWrapping="Wrap"
TextAlignment="Right"
Padding="4,0,0,0"
Grid.ColumnSpan="2" Background="Aqua"/>
<ItemsControl ItemsSource="{Binding TheValue}"
Padding="4,0,0,0"
Grid.Column="2"
HorizontalAlignment="Right">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text = "{
Binding RelativeSource =
{RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=Name}"
Grid.Column="0"
FontSize="{DynamicResource SmallSize}"
TextWrapping="Wrap" ........................
Run Code Online (Sandbox Code Playgroud) relativesource ×10
wpf ×10
binding ×6
xaml ×3
c# ×2
data-binding ×2
findancestor ×2
contextmenu ×1
datacontext ×1
datagrid ×1
interface ×1
itemssource ×1
listview ×1
silverlight ×1
styles ×1