是否可以绑定元素的name属性?

时间:2010-04-21 11:42:56

标签: wpf data-binding

我有一个网格,重复的列具有相同的样式,但名称不同,名称对我来说很重要,因此我决定创建一个模板来重复元素并从XML文件中读取名称但我发现我可以不使用绑定名称属性请帮助我sooooooooooooooooooooooooooon

这是我的代码的一部分:

<DataTemplate  x:Key="weekItemTemplate">
            <Gridx:Name="{Binding XPath=Container}" Style="{DynamicResource GridStyle}">
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.9*"/>
                    <RowDefinition Height="0.1*"/>
                </Grid.RowDefinitions>
                <Rectangle x:Name="Rectangle"  Grid.Row="0" Margin="0,0,0,0.063"/>
                <TextBlock x:Name="Christian"  HorizontalAlignment="Left" Width="18.52" Grid.Row="1" Margin="1,0,0,0"><Run Text="08"/></TextBlock>
                <TextBlock x:Name="Hejri" Grid.Row="1"  HorizontalAlignment="Right" Width="9.773" Margin="0,0,0,0"><Run Text="۰۱"/></TextBlock>
                <TextBlock x:Name="Persian"  Margin="1,0,0,0" HorizontalAlignment="Left" Width="10"><Run Text="۰"/></TextBlock>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    <Grid Margin="0,10,0,0">
        <Grid.DataContext>
            <XmlDataProvider x:Name="TeamData" Source="weekdays.xml" XPath="days/day" />
        </Grid.DataContext>
        <ListView x:Name="TeamsListBox" DockPanel.Dock="Left"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource weekItemTemplate}"
                     IsSynchronizedWithCurrentItem="True"
                     Visibility="Visible" SelectionMode="Single" />

3 个答案:

答案 0 :(得分:1)

再次考虑之后,您可以为列定义新的附加属性,并将您的名称从XML文件绑定到此属性。然后在您的代码中,您可以访问此附加属性而不是name属性。这有帮助吗?!

修改
我在谈论attached dependency property。像这样:

public static class ColumnProps
{
    public static readonly DependencyProperty MyCustomNameProperty =
        DependencyProperty.RegisterAttached(
            "MyCustomName",
            typeof(string),
            typeof(ColumnProps)
        );

    public static void SetMyCustomName(DependencyObject obj, string newValue)
    {
        obj.SetValue(MyCustomNameProperty, newValue);
    }

    public static string GetMyCustomName(DependencyObject obj)
    {
        return (string)obj.GetValue(MyCustomNameProperty);
    }
}

然后,您可以在网格上设置此属性,如下所示:

<Grid xmlns:local="...">
    <Grid.ColumnDefinitions>
        <ColumnDefinition local:ColumnProps.MyCustomName="someName" Width="100"/>
        <!-- ... -->
    </Grid.ColumnDefinitions>
    <!-- ... -->
</Grid>

其中xmlns:local应该引用定义ColumnProps类型的程序集和命名空间。

答案 1 :(得分:0)

您无法绑定到name属性(因此在运行时更改它),因为它在生成的代码(BAML和生成的代码隐藏)中用作字段名称。

答案 2 :(得分:0)

代码隐藏希望名称可以静态解析。也就是说,如果名称真的是动态的,那么在所有情况下如何编写依赖于名称的代码?也许有一种方法可以修改设计,这样您就不需要直接访问weekItem视图,而是可以使用一个模拟weekItem视图行为方式的类。例如,如果您需要注册事件或设置某些属性,您可以使用Command绑定到'WeekItemViewModel'类,并公开反映您希望视图传达的属性。

执行此操作后,您已消除了对特定名称的依赖性,这意味着您可以动态加载数据并实例化这些WeekItemViewModel类,从而使您无需了解视图实际布局的详细信息。您的代码可以更多地关注它想要如何进行交互,而不是关注如何将代码隐藏到特定的视觉效果。