为什么只有usercontrol不能使用绑定而其他人可以使用它?

时间:2017-06-24 12:58:00

标签: c# wpf data-binding user-controls

我对WPF有疑问。有两个组成部分。 1. MainWindow 2. ClothesController:UserControl

MainWindow将类“Shoes”的实例设置为“shoes1”,其属性值为“Size”= 170.此实例作为“DataContext”附加到MainWindow,可以通过Label控件“label_1”轻松引用。因此,label_1显示170.良好的预期。

我做了一个用户控件; ClothesController 它有一个DependencyProperty'Value'并绑定到UserControl。标签控件使用与'MainWindow'相同的方法引用该值。默认值为零。

通过这个控件,我做了两个'ClothesController'实例。 使用公开的DP'Value',我为一个实例分配了一个值作为绑定,而另一个实例,我只是在XAML中直接分配了一个整数。

结果是 controller_1为0; DP的默认值 controller_2是180;正如所料 label_1是170;正如预期的那样

我无法理解这一点。我错过了什么吗? 我是WPF的新手,所以我认为无论控件的类型是什么,如果它具有可修改的属性,那么无论输入是什么,如果类型与属性匹配,都应该引用它。

这是完整的代码。从MainWindow到Usercontrol

++主窗口

docker-machine ssh default free

++ cs for MainWindow

<Window x:Class="FieldUserControl_test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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:FieldUserControl_test"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <local:ClothesController Name = "controller_1" VerticalAlignment="Center" Grid.Row="0" Value="{Binding Path=Size}" Label="Size"/>
        <local:ClothesController Name = "controller_2" VerticalAlignment="Center" Grid.Row="1" Value="{Binding Path=Height, ElementName=LayoutRoot}" Label="Height"/>
        <Label Name = "label_1" Grid.Row="2" Content="{Binding Path=Size}"/>
    </Grid>
</Window> 

++用户控件; ClothesController

namespace FieldUserControl_test
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Shoes shoes1 = new Shoes() { Size = 170, Height = 200 };
            LayoutRoot.DataContext = shoes1;
        }

    }

    public class Clothes
    {
        public int Size { set; get; }
        public int Height { set; get; }
    }

    public class Shoes : Clothes
    {
    }
}
用于UserControl的

++ cs

<UserControl x:Class="FieldUserControl_test.ClothesController"
             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:local="clr-namespace:FieldUserControl_test"
             mc:Ignorable="d" 
             d:DesignHeight="30" d:DesignWidth="100">
    <Grid Name="GridRoot" Background="AliceBlue">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Label Content="{Binding Path=Label}" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/>
        <TextBox Name="Tb_shoes_size" Text="{Binding Path=Value}" VerticalAlignment="Center" Grid.Row="0" Grid.Column="1"/>
    </Grid>
</UserControl>

0 个答案:

没有答案