我有这个代码:
<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)
标记扩展(例如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)
当然,以上并不是完全发生的情况,因为Binding
MarkupExtension 另有说明,但您明白了。
如果您要创建在 C# 代码中定义的上述对象图的 XAML 表示,那就是:
<Menu>
<Menu.ItemsSource>
<Binding Path="TopMenu.MenuItems"/>
</Menu.ItemsSource>
</Menu>
Run Code Online (Sandbox Code Playgroud)