2010-06-17 42 views
1

我在WPF中建立一个UserControl。控件有两个属性Title和Description,我想绑定到两个文本块。看起来很直接,我得到它的工作,但我很好奇。为了得到它的工作,我不得不添加以下代码:数据绑定到自己没有代码

void CommandBlock_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = this; 
    } 

我的绑定是这样的:

 <TextBlock Text="{Binding Title}" Width="100" ... /> 
     <TextBlock Text="{Binding Description}" Width="100" ... /> 

什么我不知道是怎么来的我无法得到它没有工作this.DataContext = this;,而是使用DataContext="{Binding RelativeSource={RelativeSource Self}}"(在标记的UserControl元素中)?我确信我错过了DataContexts的一些东西,但不知道是什么。

回答

1

你是什么意思的“不能得到它的工作”?你得到一个绑定错误,或者你所期望的文本没有被填充?

假设后者,如果我不得不猜测,那么标题和描述属性会在控件初始化后得到填充,并且不会触发PropertyChanged事件。评论

更新你不应该需要一个依赖属性,你应该只需要实现INotifyProperyChanged。如果在属性更新之前发生初始绑定,则在更新发生时需要通知视图。

让你的控制执行INotifyPropertyChanged并添加以下内容:

public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

标题被更新再经过:

OnPropertyChanged("Title"); 

(同样的,描述)。

请注意,我还在猜测发生了什么 - 发布更多的代码,如果事实证明这不是问题。

+0

我认为你是对的,我添加了'公共静态DependencyProperty TitleProperty = DependencyProperty.Register( “标题”,typeof(字符串),typeof(TheUserControl));'它工作。尽管如此,我还是认为wpf在这方面会更聪明一些,而且不在乎财产何时更新,只是它是否是。 – jcollum 2010-06-17 20:16:59

+0

无法正常工作:属性是在设计时设置的,但这些值从未在用户控件上填充。 – jcollum 2010-06-17 20:17:41

+0

我认为你是对的...我对WPF很新,但我记得在某个地方看到这个。我真的认为我可以通过属性装饰来实现这一点。 – jcollum 2010-06-17 21:57:18