0

動的にロードしているユーザーコントロールライブラリがあります。そのライブラリから、TabitemをTabControlに挿入しています。タブを読み込んで、エラーなしで表示できます。ただし、コントロールのバインディングを機能させることができないようです。

これは、ロードして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>

タブにすべてが表示されると、「HelloWorld」ではなくTextBoxに空白があるかどうかがわかります

私は何が欠けていますか?

4

1 に答える 1

0

ユーザーコントロールのDataContextをクラスのインスタンスに設定します。そのdllをランタイムにロードするのと同じように、そのインスタンスを作成する方法は異なります。ただし、基本的にバインディングの設定は同じです。

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

    DataContext = instanceOfMyType;

基本的なデータバインディングの仕組みについては、MSDN のドキュメントを参照してください。

画面上部で正しいフレームワークを選択していることを確認してください。

編集

通常、これは別のクラス(MVVMパターンのViewModel)として作成されます。

 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);
            }
        }
    }
于 2012-09-01T23:26:37.370 に答える