对UserControl中的绑定感到困惑



我正在创建一个UserControl对象,我试图使用绑定(与PropertyChanged)分配值。我做了一个原型,当我在ViewModel中赋值时,值不会出现或修改UserControl组件,但如果我直接在视图中的UserControl对象中赋值,修改工作。我想了解我做错了什么,因为如果我只是在我的窗口上添加一个对象并直接绑定(再次,使用PropertyChanged),则工作正常。执行下面的代码:

谢谢你的帮助。

最诚挚的问候,古斯塔沃。

用户:

<UserControl x:Class="WpfControlLibrary1.UserControl1"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="30" d:DesignWidth="300">
<Grid>
    <TextBlock Text="{Binding Title}" />
</Grid>
</UserControl>

用户控件隐藏代码:

    public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
    #region Title Property
    public static String GetTitle(DependencyObject obj)
    {
        return (String)obj.GetValue(TitleProperty);
    }
    public static void SetTitle(DependencyObject obj, String value)
    {
        obj.SetValue(TitleProperty, value);
    }
    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.RegisterAttached(
            "Title",
            typeof(String),
            typeof(UserControl1),
            new FrameworkPropertyMetadata(TitleChangedCallback)
            );
    private static void TitleChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UserControl1 _this = (d as UserControl1);
    }
    private String title;
    public String Title
    {
        get { return title; }
        set
        {
            title = value;
            OnPropertyChanged("Title");
        }
    }
    #endregion
    #region INotifyPropertyChanged event and method
    public event PropertyChangedEventHandler PropertyChanged;
    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion

** My Window: **

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:uc="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <uc:UserControl1 Title="{Binding TitleVM, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>

** My Code-Behind/ViewModel: **

public partial class MainWindow : INotifyPropertyChanged
{
    // Notify WPF that Counter changed
    public event PropertyChangedEventHandler PropertyChanged;
    public MainWindow()
    {
        InitializeComponent();
        TitleVM = "açsldkfjasçldkfj";
    }
    private String titleVM;
    public String TitleVM
    {
        get { return titleVM; }
        set
        {
            titleVM = value;
            OnPropertyChanged("TitleVM");
        }
    }
    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

您的Window没有DataContext。绑定无法解析。

试试这个:

public MainWindow()
{
    InitializeComponent();
    DataContext = this; //This is what you're missing!
    TitleVM = "açsldkfjasçldkfj";
}
编辑:

你也错过了同样的事情在UserControl

public UserControl1()
{
    InitializeComponent();
    DataContext = this;
}

在HighCore的帮助下,我发现了一个问题,另一个问题是我的UserControl没有定义名称。

把:

x:Name="UserControl"

放到UserControl的XAML中,就可以了。此外,我已经修改了我的代码如下:

        public String Title
    {
        get { return (String)base.GetValue(TitleProperty); }
        set { base.SetValue(TitleProperty, value); }
    }
    public static readonly DependencyProperty TitleProperty =
     DependencyProperty.RegisterAttached(
         "Title",
         typeof(String),
         typeof(UserControl1),
         new FrameworkPropertyMetadata(null)
         );

对我们来说是一个干净的代码。

PS:没有必要写:

DataContext = this;

关于UserControl背后的代码。至少这里只导致错误,没有值传入。

感谢HighCore的帮助

相关内容

  • 没有找到相关文章

最新更新