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

Oli*_*ver 1 wpf xaml

我有这个代码:

<Menu ItemsSource="{Binding TopMenu.MenuItems}">
</Menu>
Run Code Online (Sandbox Code Playgroud)

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

<Menu>
    <Menu.ItemsSource>{Binding TopMenu.MenuItems}</Menu.ItemsSource>
</Menu>
Run Code Online (Sandbox Code Playgroud)

但它似乎无效。

我怎样才能做到这一点?

编辑:

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

<ListView  HorizontalContentAlignment="Stretch" Style="{StaticResource ListBoxInnerGroupStyle}" ItemsSource="{Binding Items}"
          Visibility="{Binding Visible,
            Converter={StaticResource BoolToVis}}"
           PreviewMouseWheel="ChildListView_PreviewMouseWheel">
Run Code Online (Sandbox Code Playgroud)

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

<ListView  HorizontalContentAlignment="Stretch" Style="{StaticResource ListBoxInnerGroupStyle}" ItemsSource="{Binding Items}"
           PreviewMouseWheel="ChildListView_PreviewMouseWheel">
    <ListView.Visibility>
        {Binding Visible, Converter={StaticResource BoolToVis}}
    </ListView.Visibility>
Run Code Online (Sandbox Code Playgroud)

Fed*_*gui 6

标记扩展(例如System.Windows.Data.Binding)具有“提供值”的能力,它只是一个对象的实例,然后被添加到对象图中,或者由 XAML 处理器以不同的方式处理。

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

<Menu ItemsSource="{Binding TopMenu.MenuItems}"/>
Run Code Online (Sandbox Code Playgroud)

由 XAML 处理器转换为如下内容:

var menu = new Menu();
menu.ItemsSource = new Binding{Path = "TopMenu.MenuItems"});  
Run Code Online (Sandbox Code Playgroud)

当然,以上并不是完全发生的情况,因为BindingMarkupExtension 另有说明,但您明白了。

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

<Menu>
  <Menu.ItemsSource>
     <Binding Path="TopMenu.MenuItems"/>
  </Menu.ItemsSource>
</Menu>
Run Code Online (Sandbox Code Playgroud)