Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.29.189] |
|
Сообщ.
#1
,
|
|
|
Есть проект WPF.
<Application x:Class="IA.WPF.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> </Application.Resources> </Application> StartupURI специально убран, для того, что бы главное окно создавалось не конструктором по умолчанию. public partial class App : Application { private const string DataFileName = "data.dat"; private static readonly Man MainUser = new Man(); protected override void OnStartup(StartupEventArgs e) { var mainWnd = new ManWnd {Man = MainUser}; } } Ну там еще есть код, но он к делу не относится и работает нормально. Есть такое окно: <Window x:Class="IA.WPF.ManWnd" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ManWnd" Height="319" Width="506" WindowStartupLocation="CenterScreen"> <DockPanel Name="dpnLayout"> <Label SnapsToDevicePixels="True" Name="lblOwner" DockPanel.Dock="Top" VerticalAlignment="Top" Margin="5" BorderThickness="1" BorderBrush="Black" FontWeight="Bold">Лабел</Label> <Grid Name="stpLayout" DockPanel.Dock="Top" Margin="5"> <Grid.ColumnDefinitions> <ColumnDefinition Name="colList" Width="*" /> <ColumnDefinition Name="colInfo" Width="2*" /> </Grid.ColumnDefinitions> <ListBox Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="lsbPeoples" DisplayMemberPath="FullName"/> </Grid> </DockPanel> </Window> Код такой: namespace IA.WPF { /// <summary> /// Interaction logic for ManWnd.xaml /// </summary> public partial class ManWnd : Window { private Man _Man; public Man Man { get { return _Man; } set { _Man = value; lblOwner.Content = _Man.FullName; lsbPeoples.DataContext = _Man.Relatives; } } public ManWnd() { InitializeComponent(); } } } Все работает... Но хотелось бы обойтись без строки lsbPeoples.DataContext = _Man.Relatives; в C# коде. Как можно в XAML прописать что бы занчения листбокс брал из поля класса окна? Если это вообще возможно... |
Сообщ.
#2
,
|
|
|
Можно обойтись... но код XAML не смогу привести, но скажу что надо наследоваться классу Man от ListBoxItem и указать потом его как ресурс для ListBox.
а вот тут более подробно сюда |
Сообщ.
#3
,
|
|
|
Суть не втом. Суть в том, как в разметке получить доступ к полую экземпляра, а не статическому.
Для статического поля нашел такой вариант: public partial class ManWnd : Window { public static ObservableCollection<Man> Mans = new ObservableCollection<Man>(); private Man _Man; public Man Man { get { return _Man; } set { _Man = value; lblOwner.Content = _Man.FullName; // lsbPeoples.DataContext = _Man.Relatives; Mans.Clear(); foreach (var man in _Man.Relatives) { Mans.Add( man ); } } } public ManWnd() { InitializeComponent(); } } <ListBox Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="LsbPeoples" ItemsSource="{x:Static src:ManWnd.Mans}" DisplayMemberPath="FullName" /> Но это все-таки немного не то, что я хотел. Добавлено Получается что форма может быть только одна. |
Сообщ.
#4
,
|
|
|
Вопрос решил таким образом
public partial class ManWnd : Window { public Man Man { get; set; } public ManWnd() { InitializeComponent(); DataContext = this; } } <ListBox BorderThickness="1" BorderBrush="Black" Name="lsbPeoples" ItemsSource="{Binding Path=Man.Relatives}" DisplayMemberPath="FullName" /> Кто хорошо разбирается, прокмментируйте, пожалуйста, какие засады есть у такого способа? |
Сообщ.
#5
,
|
|
|
Там еще как-то можно поиграться с
Binding="{... RelativeSource={RelativeSource Self}}" подробнее уже не помню -- т.е. в xaml для самого окна попробовать задать DataContext="{Binding RelativeSource={RelativeSource Self}}", а уже для контрола - то, что ты указал. Но как по мне - можно одинаково "забыть" указать что xaml-разметку, что "DataContext = this;". Да и твой вариант мне нравится больше |
Сообщ.
#6
,
|
|
|
Цитата Raino @ Но как по мне - можно одинаково "забыть" указать что xaml-разметку, что "DataContext = this;". Забыть то можно, но я стермился к полному разделению кода и разметки, что бы дезайнер мог полностью извращаться как ему заблагорассудится, не держа в уме какие-то условности... ЗЫЖ Спасибо за коммент, закрывают тему. |