2012-09-01 31 views
0

我有一个用户控制库,我正在动态加载。从那个lib中,我将Tabitem插入TabControl。我可以加载选项卡,并显示它没有错误。但是,我似乎无法获得控制工作的约束力。未引用的程序集中的C#/ WPF UserControl绑定

这是我使用加载它,并将它添加到TabControl的代码:

Assembly moduleAssembly = Assembly.Load("ControlLib");    
    UserControl uc = (UserControl)Application.LoadComponent(new System.Uri("/ControlLib;component/UserControl1.xaml", UriKind.RelativeOrAbsolute)); 
    TabControl itemsTab = (TabControl)this.FindName("mainTabControl"); 
    TabItem newTab = new TabItem(); 
    newTab.Content = uc; 
    newTab.Header = "Test"; 
    itemsTab.Items.Add(newTab); 
    itemsTab.SelectedItem = newTab; 

这是控制C#代码:

public partial class UserControl1 : UserControl 
{   
    public static readonly DependencyProperty TestStringProperty = 
     DependencyProperty.Register("TestString", typeof(string), typeof(UserControl1)); 

    public string TestString { get; set; } 

    public UserControl1() 
    { 
     InitializeComponent(); 

     TestString = "Hello World"; 
    } 
} 

这是该XAML代码控制:

<UserControl x:Class="ControlLib.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="300" d:DesignWidth="300"> 
    <Grid>   
     <TextBox Height="30" Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom" Text="{Binding Path=TestString, Mode=TwoWay}" /> 
    </Grid> 
</UserControl> 

当选项卡显示我看到的所有文本框中的空白而不是“Hello World”

我错过了什么?

回答

0

您仍然可以将用户控件的DataContext设置为该类的实例。你如何去创建这个实例是不同的,因为你会加载该DLL的运行时。但基本上绑定设置保持不变。

var assembly = Assembly.LoadFrom(@"yourdllname.dll"); 
    Type type = assembly.GetType("ClassLibrary1.SampleViewModel"); 
    object instanceOfMyType = Activator.CreateInstance(type); 

    DataContext = instanceOfMyType; 

关于基本数据绑定工作原理的阅读MSDN documentation

确保您在屏幕顶部选择了正确的框架。

EDIT

通常这被创建为一个单独的类(视图模型中MVVM模式)。

public partial class Window3 : Window, INotifyPropertyChanged 
    { 
     public Window3() 
     { 
      InitializeComponent(); 

      DataContext = this; 
      TestString = "Hello World."; 
     } 

     string _testString; 
     ///<summary>Gets or sets TestString.</summary>    
     public string TestString 
     { 
      get { return _testString; } 
      set { _testString = value; OnPropertyChanged("TestString"); } 
     } 



     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       var e = new PropertyChangedEventArgs(propertyName); 
       PropertyChanged(this, e); 
      } 
     } 
    } 
+0

如果我将DataContext设置为UC将不会为整个应用程序分配DataContext?我只是需要它的问题标签。我尝试设置选项卡项目datacontext到UC,我也尝试将整个DataContext设置为UC,都没有工作。我更新了代码以显示我正在使用的确切代码...您的代码有点不同,所以我尝试了它。无论哪种方式,我都会得到相同的结果...项目显示但绑定失败。我觉得我错过了一些'小'的东西... –

+0

见编辑。将数据上下文设置为UC将不会为整个应用程序分配数据上下文。它由视觉树中的元素继承。除非我在你的需求中丢失了某些东西,否则这里不需要依赖属性。 – SKG

+0

谢谢SKG!这解决了我的问题......我不需要DP,我完全误解了UC中的DataContext。我真的很感谢你的帮助! –