我创建了一个UserControl(MediaList),其中包含绑定到属性“ToolsBar”的ItemControl。这个想法是允许从MediaList控件外部添加自定义按钮/控件。绑定到包含ItemControl数据的UserControl
我的问题是,我试图将一个按钮添加到具有绑定到UserControl本身的ToolsBar。我不重写我的MediaList(UserControl)的DataContext为“this”,因为我需要使用在根窗口中定义的DataModel。
也许我这样做的方式是完全错误的?
这里是使用自定义按钮将medialist中的该窗口的为例:
<localControls:MediaList x:Name="NewMediaList">
<localControls:MediaList.ToolsBar>
<Button Content="{StaticResource ResourceKey=MoveToPlaylist}"
IsEnabled="{Binding ElementName=NewMediaList, Path=SelectedMedia, Converter={localConverters:ObjectToBool}}"/>
</localControls:MediaList.ToolsBar>
</localControls:MediaList>
直到现在我试图多个种如没有成功绑定:
- {结合的ElementName = MediaListControl,Path = SelectedMedia,Converter = {localConverters:ObjectToBool}}“
- {Binding RelativeSource = {x:Static RelativeSource.Self},Path = SelectedMedia,Converter = {localConverters:Debug}}
- {结合SelectedMedia,的RelativeSource = {的RelativeSource FindAncestor,AncestorType = {X:类型用户控件}}}
- {结合SelectedMedia,的RelativeSource = {的RelativeSource FindAncestor,AncestorType = {X:类型localControls:medialist中}}}
注意我把它们从我的记忆中写回来,我也尝试过(并且没有)将MediaControl.xaml中的ItemControl和StackPanel(它包含ItemControm)的DataContext设置为MediaList对象本身。
MediaList.xaml:
<UserControl x:Class="MediaPlaylist.Controls.MediaList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:localConverters="clr-namespace:Suisse.MediaPlaylist.Converters"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
x:Name="MediaListControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0"
AutoGenerateColumns="False"
ItemsSource="{Binding ElementName=MediaListControl, Path=Playlist.Medias}"
SelectedItem="{Binding ElementName=MediaListControl, Path=SelectedMedia, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Title"
Binding="{Binding Title}"
IsReadOnly="True"/>
<DataGridTextColumn Header="File"
Binding="{Binding FilePath}"
IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Right"
Grid.Row="1">
<ItemsControl ItemsSource="{Binding ElementName=MediaListControl, Path=ToolsBar}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<Separator Visibility="{Binding ElementName=MediaListControl, Path=ToolsBar.Count, Converter={localConverters:ObjectToVisibility}}" />
<Button
HorizontalAlignment="Right"
Content="Delete"
Click="OnDelete_Click"
IsEnabled="{Binding ElementName=MediaListControl, Path=SelectedMedia, Converter={localConverters:ObjectToBool}}"/>
</StackPanel>
</Grid>
感谢
您是否尝试过使用全名称空间来设置祖先类型:{x:Type localControls:MediaList}? – zahir
Oups我在我的问题中犯了一个错误,但是我在编写时使用了完整的命名空间({x:Type localControls:MediaList}) – 0xCDCDCDCD