2016-08-24 4 views
1

Я создал свое первое решение WPF MVVM. Я создал UserControl, и я хотел бы повторно использовать этот элемент управления в моем MainWindow, потому что стиль является одним и тем же различием между этими двумя элементами управления - источником данных. Первый элемент управления использует индекс ObervableCollection 0 и второй UserControl использует один и тот же индекс OberservableCollection 1. Наблюдаемый коллектив находится в моей модели Mainview, и привязка работает хорошо, если я делаю привязку внутри моего UserControl.Пользовательский контроль доступа к другим элементам управления

не хотят связывать внутри UserControl моей модели, как это:

UserControl:

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Text="PersonModel.FirstName"></TextBlock> 
     <TextBlock Grid.Row="1" Text="PersonModel.FirstName"></TextBlock> 
    </Grid> 

Я хотел бы, чтобы связать каждый вложенный контроль над моей UserControl в моем MainWindow.

MainWindow.xaml

<desktop:UserControl1 Textblock1.Text="{Binding PersonModel.FirstName} TextBlock2.Text="{Binding PersonModel.LastName}"></desktop:UserControl1> 
+0

Аналогичный вопрос и некоторые ответы http://stackoverflow.com/questions/19491951/xaml-access-to-controls-inside-user-control – Shazter

ответ

1

Это легко выставить что-нибудь Привязываемое как UserControl свойства зависимостей, здесь CustomText один:

public partial class UserControl1 : UserControl 
{ 
    public string CustomText 
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set { SetValue(CustomTextProperty, value); } 
    } 
    public static readonly DependencyProperty CustomTextProperty = 
     DependencyProperty.Register("CustomText", typeof(string), typeof(UserControl1), new PropertyMetadata()); 

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

В XAML привязываются к нему:

<UserControl ... > 
    <TextBlock Text="{Binding CustomText}" /> 
</UserControl> 

И использование будет:

<local:UserControl1 CustomText="{Binding SomeProperty" /> 

Другой подход заключается в использовании дозвона свойства зависимостей, таким образом, вы можете многое изменить в коде позади UserControl, например, начните анимацию.

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


Еще одна возможность заключается в том, чтобы дать UserControl имя и использовать его в коде позади окна. В таком случае вы можете выставить UserControl управления, давая им имена (x:Name) и используя свойства:

public partial class UserControl1 : UserControl 
{ 
    public TextBlock TextBlock => textBlock; // textBlock is x:Name 
    ... 
} 

Теперь вы можете bind in code до, например, userControl1.TextBlock.Visibility (где userControl1 - x:Name от <local:UserControl1 />).

Смежные вопросы