2014-11-25 6 views
0

Я наткнулся на проблему и надеюсь, что кто-то сможет мне помочь в ее решении.Ошибка привязки WPF UserControl

У меня есть сборка с несколькими UserControls. Я бы хотел загрузить UserControl с этого внешних сборок во время выполнения (и сделать снимок экрана позже, не показывая его на экране).

UserControl XAML

<UserControl x:Class="MyAssembly.Test" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Button x:Name="TD1" 
       Height="30" 
       Width="100" 
       Content="{Binding ABC}"/> 
    </Grid> 
</UserControl> 

"модель вид"

public class TestClass : INotifyPropertyChanged 
{ 
    private string _abc = "Initial value"; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string ABC 
    { 
     get 
     { 
      return _abc; 
     } 
     set 
     { 
      if (value == _abc) 
      { 
       return; 
      } 
      _abc = value; 
      OnPropertyChanged1("ABC"); 
     } 
    } 

    protected virtual void OnPropertyChanged1(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Кусок кода, который вызывает головные боли

Assembly.LoadFrom("MyAssembly.dll"); 
var uri = new Uri(@"/MyAssembly;component/Test.xaml"), UriKind.Relative); 
var view = (Control)Application.LoadComponent(uri); 
view.Width = 800; 
view.Height = 600; 
view.RenderSize = new Size(800, 600); 
view.Background = Brushes.White; 

var viewModel = new TestClass(); 
view.DataContext = viewModel; 
viewModel.ABC = "7"; 

Однако ни при установке DataContext, ни при изменении свойства ABC TD1 Содержимое меняется. Он всегда остается нулевым (если я смотрю на него с помощью отладчика).

Как заставить .Net делать привязку (от ABC в этом примере) в соответствии с xaml, загруженным из внешней сборки?

+0

ли он работать просто Paparazzi

+0

@nbulba это стандарт 'Button' с шаблоном по умолчанию? Если нет, и вы установили 'Content =" ABC "', он отображает _ABC_? – dkozl

+0

@dkozl Да, если я оставлю Content = «ABC», он работает так, как ожидалось, поскольку привязка фактически не задействована. Да, это стандартная кнопка. – nbulba

ответ

0

Хорошо, я нашел способ создания привязок. Все, что нужно сделать, это позвонить по телефону UpdateLayout.

Assembly.LoadFrom("MyAssembly.dll"); 
var uri = new Uri(@"/MyAssembly;component/Test.xaml"), UriKind.Relative); 
var view = (Control)Application.LoadComponent(uri); 
view.Width = 800; 
view.Height = 600; 
view.RenderSize = new Size(800, 600); 
view.Background = Brushes.White; 

var viewModel = new TestClass(); 
view.DataContext = viewModel; 
viewModel.ABC = "7"; 

view.UpdateLayout();