Информация доступа к WPF из содержащего элемента управления - PullRequest
0 голосов
/ 14 мая 2009

У меня есть UserControl (a) со стековой панелью, для которой ItemSource установлен в коллекцию. Затем StackPanel содержит набор UserControl (b), который содержит несколько кнопок и элемент управления сеткой данных. Есть ли способ из кода в UserControl (b) для доступа к свойствам в коде родительского UserControl (a).

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

1 Ответ

2 голосов
/ 15 мая 2009

Обычно с 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, я не уверен, что он будет работать там (не пытался проверить, являются ли расширения разметки толерантными к пробелу) ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...