从子usercontrol绑定到ElementName

时间:2013-07-09 13:45:31

标签: wpf xaml binding relativesource

我必须传递GridControl的CommandParameter以进行布局的序列化。

我执行命令的按钮位于子用户控件中。

我成功使用RelativeSource来访问包含GridControl的网格。

编辑: 此按钮位于名为GridSettings.xaml的用户控件中。这是Grid.xaml的一个孩子。

<Button Content="Save Defaults" Command="{Binding SaveDefaultsCommand}" Width="90" CommandParameter="{Binding Path=gridControl1, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=2}}"/>

以下是Grid.xaml父视图的相关部分。

                <Grid Grid.Row="1" x:Name="GridView">
                <dxg:GridControl x:Name="gridControl1"  ItemsSource="{Binding WeldReports}" AutoPopulateColumns="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Loaded">
                            <Custom:EventToCommand Command="{Binding GridLoadedCommand}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <dxg:GridControl.View>
                        <dxg:TableView Name="tableView1" ShowTotalSummary="True" />
                    </dxg:GridControl.View>
                </dxg:GridControl>
            </Grid>

我得到的错误: System.Windows.Data错误:40:BindingExpression路径错误:'object'''Grid'(Name ='GridView')'上找不到'gridControl1'属性。 BindingExpression:路径= gridControl1; DataItem ='Grid'(Name ='GridView'); target元素是'Button'(Name =''); target属性是'CommandParameter'(类型'Object')

Path = gridControl1应该是ElementName = gridControl1 ...但是ElementName不能与RelativeSource一起工作......所以我读了。

1 个答案:

答案 0 :(得分:0)

Path中的Binding需要代表一个属性。您可以通过向Grid.xaml.cs添加一个包装器属性为GridControl创建此属性,该属性只返回已为您创建的gridControl1字段,因为XAML中设置了x:Name

public object MyGridControl
{
  get { return gridControl1; }
}

CommandParameter="{Binding Path=MyGridControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=2}}"

您还应该考虑尝试重新构建应用程序,以避免需要将UI控件作为命令参数传递,尤其是需要超出本地范围,就像您在此处所做的那样。它的设置方式现在控件紧密耦合。