繁体   English   中英

附加属性绑定在我的用户控件中失败

[英]Attached property binding failed in my user control

我有一个UsersControl.xaml

<UserControl x:Name="userControl" x:Class="Lloyd.Shared.Controls.UsersControl"
         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:Interactivity="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:Behaviors="clr-namespace:Lloyd.Shared.Controls.Behaviors"
         xmlns:local="clr-namespace:Lloyd.Shared.Controls"
         mc:Ignorable="d" DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"
         d:DesignHeight="300" d:DesignWidth="300">

<Interactivity:Interaction.Behaviors>
    <Behaviors:ImportUsersOnLoadedBehavior />
</Interactivity:Interaction.Behaviors>
<DockPanel LastChildFill="True">
    <Label Content="账号" DockPanel.Dock="Top" FontSize="18.667" />

    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right">
        <Button x:Name="AddAccountButton" Height="26" Width="80" Content="添加" Margin="5" Command="{Binding AddUserCommand}" />
        <Button x:Name="ImportAccountsButton" Height="26" Width="80" Content="导入" Margin="5" Command="{Binding ImportUsersCommand}"/>
        <Button x:Name="DeleteAccountButton" Height="26" Width="80" Content="删除" Margin="5" Command="{Binding RemoveUsersCommand}"/>
    </StackPanel>

    <ListView x:Name="accountListbox" Margin="5" BorderThickness="1" BorderBrush="{DynamicResource AccentColorBrush}" ItemsSource="{Binding UsersCollection}"/>
</DockPanel>

后面的代码

public partial class UsersControl : UserControl
{
    public static ObservableCollection<User> GetUsersCollection(DependencyObject obj)
    {
        return (ObservableCollection<User>)obj.GetValue(UsersCollectionProperty);
    }

    public static void SetUsersCollection(DependencyObject obj, ObservableCollection<User> value)
    {
        obj.SetValue(UsersCollectionProperty, value);
    }

    // Using a DependencyProperty as the backing store for UsersCollection.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UsersCollectionProperty =
        DependencyProperty.RegisterAttached("UsersCollection", typeof(ObservableCollection<User>), typeof(UsersControl), new FrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.AffectsRender));


}

我在MainWindow.xaml中使用此UsersControl,并将UsersCollection绑定到主窗口的DataContext。

<Controls:MetroWindow x:Class="ZggwwDocuments.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:c="clr-namespace:Lloyd.Shared.Controls;assembly=Lloyd.Shared.Controls"
    xmlns:vm="clr-namespace:ZggwwDocuments.ViewModels"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ZggwwDocuments"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="697.514">
<Controls:MetroWindow.DataContext>
    <vm:MainWindowViewModel/>
</Controls:MetroWindow.DataContext>
<Grid Margin="5">
    <c:UsersControl UsersCollection="{Binding Users}"  />
</Grid>

我在MainWindow上设置了断点,它的DataContext和Users属性不为null。 但是MainWindow.DataContext.Users和UsersControl.UsersCollection之间的绑定失败。 以下是“输出”窗口中的内容

System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“ UsersControl”(名称=“ userControl”)上找不到“ Users”属性。 BindingExpression:路径=用户; DataItem ='UsersControl'(Name ='userControl'); 目标元素是“ UsersControl”(名称=“ userControl”); 目标属性为“ UsersCollection”(类型为“ ObservableCollection`1”)

UsersControl.xaml.cs中的GetUsersCollection(DependencyObject obj)始终返回null

尝试

ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type c:UsersControl}}, Path=UsersCollection}"

或者,您可以变得聪明并接受;

<DockPanel LastChildFill="True">
    <Label Content="账号" DockPanel.Dock="Top" FontSize="18.667" />

    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right">
        <Button x:Name="AddAccountButton" Height="26" Width="80" Content="添加" Margin="5" Command="{Binding AddUserCommand}" />
        <Button x:Name="ImportAccountsButton" Height="26" Width="80" Content="导入" Margin="5" Command="{Binding ImportUsersCommand}"/>
        <Button x:Name="DeleteAccountButton" Height="26" Width="80" Content="删除" Margin="5" Command="{Binding RemoveUsersCommand}"/>
    </StackPanel>

    <ListView x:Name="accountListbox" Margin="5" BorderThickness="1" BorderBrush="{DynamicResource AccentColorBrush}" ItemsSource="{Binding UsersCollection}"/>
</DockPanel>

...并将其推入内部;

<UserControl.Template>
   <ControlTemplate TargetType="{x:Type UserControl}">
      (paste it here)
   </ControlTemplate>
</UserControl.Template>

然后将绑定更改为;

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=UsersCollection}

我个人建议使用这种方法,而不是第一种方法,因为这种方法绑定起来更快,更不易出现“问题”……这也意味着您要覆盖用户控件的模板以使其成为您真正想要的模板它不仅仅是在现有模板中转储一些XAML。

尝试像下面这样调用您的附加属性:

<c:UsersControl UsersControl.UsersCollection="{Binding Users}"  />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM