相关疑难解决方法(0)

从DataTemplate访问父DataContext

我有一个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.这是不可接受的,因为用户控件的其余部分会自动绑定到CurrentItemon的属性BindingList.

如何在样式中指定绑定表达式,以便无论父数据上下文是集合视图还是单个项目,它都可以工作?

data-binding wpf xaml relativesource datatemplate

101
推荐指数
4
解决办法
11万
查看次数

WPF绑定到父DataContext

我们有一个带有标准MVVM模式的WPF应用程序,利用Cinch(以及MefedMVVM)进行View - > ViewModel解析.这很好用,我可以将相关控件绑定到ViewModel上的属性.

在特定的视图中,我们有一个Infragistics XamGrid.此网格绑定到ViewModel上的ObservableCollection,并显示相应的行.但是,我在这个网格上有一个特定的列,我试图将TextBox文本值绑定到父DataContext上的属性,而不是ObservableCollection.这种绑定失败了.

我们在这里经历了几个选项,包括:

  1. 使用AncestorType跟踪树并绑定到父UserControl的DataContext,如此(从这个问题的答案很好,以及这个)...

    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 指定ElementName并尝试直接定位顶级控件.有一个看看这里,如果你想了解使用的ElementName.

  3. 使用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 ...你只需要添加你想要的列,然后关闭相关的标签.

c# wpf binding

44
推荐指数
1
解决办法
10万
查看次数

将一个fill属性绑定到样式中ContentControl的Foreground属性的路径中

我有银色问题我用了两天时间来打架:带有样式的模板控制按钮.在具体按钮中,我有一个以路径为内容的画布.问题是我希望路径填充颜色从模板中的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)

我已经清理了代码并删除了一些内容以使其更具可读性,但我希望你能够了解它背后的想法.

.net silverlight silverlight-3.0 windows-phone-7

13
推荐指数
1
解决办法
2292
查看次数

有没有办法将Command与WPF Toolkit DataGridHyperlinkColumn相关联?

有什么办法可以将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 datagrid command wpftoolkit

6
推荐指数
1
解决办法
4831
查看次数

UserControl使用wpf中的父元素?

当你在wpf中有一个usercontrol时,它可以到达其父元素的外部吗?例如,我的用户控件只列出了控件内部的一些通用的东西,它们被封装在主窗口的dockpanel中,但是我在主窗口中有一个文本框和按钮,我想从控件中访问...这可能吗?

这将节省我很多时间,而不是改变整个窗口的内容,并在每个用户控件中显示相同的文本框/按钮.如果有人有这方面的例子,我将不胜感激.

c# wpf xaml user-controls

6
推荐指数
1
解决办法
2594
查看次数

树遍历 - 从只有父指针的叶子开始?

从概念上讲,通过从给定的叶子节点(而不是根节点)开始并使用父指针到达根目录,可以在其中遍历它的树吗?

我问这个,因为我看到有人实现了一个树,他们使用一个数组来保存所有叶子节点/外部节点,每个叶子/外部节点只指向它们的父节点,而那些父节点指向它们的父节点等等.你到达没有父母的根节点.因此,它们的实现将要求你从其中一个叶子开始到达树中的任何地方,并且你不能"下"树,因为她的树节点没有任何子指针,只有父指针.

我发现这个实现很有趣,因为我没有看到类似的东西,但我很好奇它是否仍然可以被视为"树".我从来没有见过一棵树,你开始遍历叶子,而不是根.我也从未见过一棵树,其中树节点只有父指针而没有子指针.

tree abstract-data-type data-structures

6
推荐指数
1
解决办法
5044
查看次数

将Custom Control内的TextBlock绑定到同一个Custom Control的依赖项属性

我有一个带有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)

c# data-binding wpf xaml custom-controls

4
推荐指数
2
解决办法
2478
查看次数

将IsEnabled绑定到父ViewModel而不是UserControl ViewModel

我在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并不是很优雅...

.net c# data-binding silverlight mvvm-light

3
推荐指数
1
解决办法
3199
查看次数

DataGrid中按钮的可见性

我有一个包含三列的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)

谢谢!

c# wpf

2
推荐指数
1
解决办法
706
查看次数

如何从代码隐藏中绑定属性,而其余属性则绑定到 DataContext?

我的目标是将 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}"

data-binding wpf xaml code-behind

2
推荐指数
1
解决办法
1288
查看次数