Обычно с WPF я бы предложил вам реализовать шаблон Model-View-ViewModel (см. MSDN ).
С помощью этого шаблона вы создадите ViewModel со всеми данными, которые вы хотите связать. Это будет установлено в качестве контекста данных для (a) usercontrol. Этот элемент управления затем связал бы все свои элементы управления со свойствами в тексте данных.
Дочерний (b) usercontrol будет наследовать этот текстовый текст данных и, следовательно, может привязывать свои элементы управления к тем же свойствам, которые использует (a). Это связано с тем, что объекты данных наследуются по логическому (и визуальному) дереву до тех пор, пока оно не будет переопределено.
Так что для вас я бы хотел создать ViewModel, которая содержит свойство ReadOnly. Затем вы можете установить этот объект ViewModel в качестве текста данных для (a) usercontrol. (B) usercontrol, поскольку он находится в иерархии (a) usercontrol, будет наследовать тот же текст данных. Это позволит вам связать элементы управления в (b) с теми же свойствами, что и (a), как показано ниже.
<Button IsEnabled="{Binding ReadOnly}"
Context="Click me!"
Command="{Binding ClickMeCommand}" />
Чтобы установить текстовый текст данных в выделенном коде, я делаю что-то вроде этого конструктора, показанного ниже.
public MyView(IMyViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
MyView - это класс, который наследуется от UserControl в вашем экземпляре. Вам не нужно получать модель представления таким же образом, как я, я использую Unity для внедрения модели представления в виды, которые создаются автоматически, поскольку я использую Prism, но вы можете просто создать ее как обычный объект и назначить его к текстовому соединению.
Обратите внимание, что я также привязал команду к кнопке с помощью datacontext, так как я обычно выставляю их также через ViewModel, это легко, если вы создаете класс-оболочку, который реализует ICommand и прокси для делегата. См. статью блога DelegateCommand или посмотрите класс DelegateCommand в Prism , если вам интересно.
Если по какой-то причине вы перезаписываете текст данных, что может произойти при использовании основного / подробного представления, когда вы изменяете текст данных раздела сведений для представления в качестве текущего выбранного элемента в списке, вы все равно можете получить доступ к родительский текст данных с использованием относительной привязки источника.
1025 * Е.Г. *
<ComboBox Grid.Row="1" Grid.Column="1" x:Name="Unit" IsReadOnly="True"
ItemsSource="{Binding Path=DataContext.AvailableUnits, RelativeSource=
{RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name" SelectedItem="{Binding Unit}" />
Обратите внимание, что привязка ItemsSource использует относительный источник для поиска родительского окна, а затем связывается со свойством его datacontext. Я также разделил привязку ItemsSource в кавычках по нескольким строкам для ясности здесь, но не делайте этого в вашем xaml, я не уверен, что он будет работать там (не пытался проверить, являются ли расширения разметки толерантными к пробелу) ).