在xaml中绑定标签/元素而不是属性?

时间:2014-03-18 16:30:44

标签: wpf xaml

我有这段代码:

<Menu ItemsSource="{Binding TopMenu.MenuItems}">
</Menu>

这可以按预期工作。但是,我想将ItemsSource定义为Menu的子元素,而不是属性。我试过这个:

<Menu>
    <Menu.ItemsSource>{Binding TopMenu.MenuItems}</Menu.ItemsSource>
</Menu>

但似乎无效。

我怎样才能做到这一点?

修改

我想这样做是为了更好地布置我的文件。例如,我有许多属性的元素,如:

<ListView  HorizontalContentAlignment="Stretch" Style="{StaticResource ListBoxInnerGroupStyle}" ItemsSource="{Binding Items}"
          Visibility="{Binding Visible,
            Converter={StaticResource BoolToVis}}"
           PreviewMouseWheel="ChildListView_PreviewMouseWheel">

使用ListView具有的所有属性,很难对文档进行布局,以避免很长,难以读取的行。特别是大Visibility属性很难格式化。因此,我想将像这样的大型属性更改为子元素。对于上面的例子,我认为这更容易阅读:

<ListView  HorizontalContentAlignment="Stretch" Style="{StaticResource ListBoxInnerGroupStyle}" ItemsSource="{Binding Items}"
           PreviewMouseWheel="ChildListView_PreviewMouseWheel">
    <ListView.Visibility>
        {Binding Visible, Converter={StaticResource BoolToVis}}
    </ListView.Visibility>

1 个答案:

答案 0 :(得分:4)

Markup Extensions(例如System.Windows.Data.Binding)能够&#34;提供值&#34; ,它只是一个对象的实例,然后是添加到对象图中,或由XAML处理器以不同方式处理。

简而言之,这意味着语法:

<Menu ItemsSource="{Binding TopMenu.MenuItems}"/>

由XAML处理器翻译成如下:

var menu = new Menu();
menu.ItemsSource = new Binding{Path = "TopMenu.MenuItems"});  

当然上面的内容并不完全是这样,因为Binding MarkupExtension另有说明,但你明白了。

如果您要创建C#代码中定义的上述对象图的XAML表示,那将是:

<Menu>
  <Menu.ItemsSource>
     <Binding Path="TopMenu.MenuItems"/>
  </Menu.ItemsSource>
</Menu>