Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
asutp
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 23
1

Как задать DataContext в XAML?

10.10.2013, 22:43. Просмотров 5481. Ответов 13
Метки нет (Все метки)

В классе окна объявлен объект другого класса.
Привязал привязал TextBlock к одному из полей этого класса.
К DataContext привязывался в коде
C#
1
2
3
4
5
6
7
8
9
public partial class AIFacePlate : Window
    {
        CmdInterface cmd = new CmdInterface();
        public AIFacePlate()
        {
            InitializeComponent();
            //TextBlock Name
            tbCmdValue.DataContext = cmd;       
        }
XML
1
<TextBox Name="tbCmdValue" Text="{Binding Path=Value}" ....
Так работает.
Вопрос. Как указать DataContext в коде XAML? B как использовать Source в XAML в моем случае?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 22:43
Ответы с готовыми решениями:

Как подключить DataContext из xaml
Уважаемые, подскажите как подключить DataContext из xaml'a ?) Обычно делаю...

Как установить DataContext для пространства имен http://schemas.microsoft.com/expression/blend/2008 в XAML
Пытаюсь сделать так ...

Как задать ожидаемый тип DataContext?
День добрый! Вопрос, собственно, в заголовке. Предположим, есть UserControl...

Как задать условие в разметке XAML?
У меня есть список элементов, каждый элемент это объект. Также у меня есть ...

Как в DataGrid задать столбцы в xaml?
вопрос в заголовке

13
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
11.10.2013, 09:13 2
C#
1
2
3
public partial class MainWindow : Window
{
    public static ObservableCollection<ProcessEntry> ProcessList { get; set; }
c использованием ресурса
XML
1
2
3
<CollectionViewSource x:Key="processList" Source="{Binding Source={x:Static local:MainWindow.ProcessList}}" />      
...     
DataContext="{Binding Source={StaticResource processList}}"
Прямой биндинг на Свойство/Коллекцию:
XML
1
DataContext="{Binding Source={x:Static local:MainWindow.ProcessList}
2
asutp
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 23
11.10.2013, 10:39  [ТС] 3
А если свойство не static?
0
Gromnorg
8 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 22
11.10.2013, 13:11 4
вместо UserControl'a ставь твой вариант
XML
1
2
3
4
5
6
7
8
9
<Window x:Class="myNamespace.AIFacePlate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="aIFacePlate">
    <Grid>
          <TextBox Name="tbCmdValue" Text="{Binding Path=Value}" 
            DataContext="{Binding ElementName=aIFacePlate, Path=cmd}" /> 
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
public partial class AIFacePlate : Window
{
        CmdInterface cmd = new CmdInterface();
        public AIFacePlate()
        {
            InitializeComponent();          
        }
}
Если надо сделать обновления значения cmd
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public partial class AIFacePlate : Window, INotifyPropertyChanged
{
        #region  INotifyPropertyChanged declaration
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            var _handler = PropertyChanged;
            if (_handler != null)
                _handler(this, new PropertyChangedEventArgs(propertyName));
        }
 
        #endregion
    
        CmdInterface cmd = new CmdInterface();
        public AIFacePlate()
        {
            InitializeComponent();  
            cmd = new CmdInterface("new data param");
            OnPropertyChanged("cmd");
        }
}
1
asutp
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 23
11.10.2013, 20:07  [ТС] 5
Спасибо, но чет не работает всё равно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 public class CmdInterface : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
 
            ushort value;
            public ushort Value
            {
                get { return this.value; }
                set { this.value = value; OnPropertyChanged("Value"); }
            }
            public CmdInterface()
            {
                value = 135;
            }
 
            protected void OnPropertyChanged(string name)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(name));
                }
            }
        }
C#
1
2
3
4
5
6
7
8
9
public partial class MainWindow : Window
    {
        CmdInterface cmd = new CmdInterface();
        public MainWindow()
        {
            InitializeComponent();
            //tbCmdValue.DataContext = cmd; //Вот так работает
        }
    }
XML
1
2
3
4
5
6
7
8
9
10
<Window x:Class="AIFacePlate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="aIFacePlate"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="20" Width="100" Name="tbCmdValue"
  DataContext="{Binding ElementName=aIFacePlate, Path=cmd}"  Text="{Binding Path=Value}" />
    </Grid>
</Window>
0
Gromnorg
8 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 22
11.10.2013, 21:14 6
хех... тяпница все же сказывается просмотрел как вы объявляете переменную cmd. В классе CmdInterface переменную, которую будете связывать правильно объявили, а вот саму переменную класса забыли через {get;set;} объявить.
C#
1
2
3
4
5
6
7
8
9
10
public partial class MainWindow : Window
    {
        public CmdInterface cmd  {get;set;}
        public MainWindow()
        {
            cmd = new CmdInterface();
            InitializeComponent();
            //tbCmdValue.DataContext = cmd; //Вот так работает
        }
    }
соответственно пользуем INotifyPropertyChanged для обновления cmd, если таковое планируется...
1
_Mutex
Заблокирован
11.10.2013, 23:24 7
Цитата Сообщение от Konctantin Посмотреть сообщение
C#
1
2
3
public partial class MainWindow : Window
{
    public static ObservableCollection<ProcessEntry> ProcessList { get; set; }
c использованием ресурса
XML
1
2
3
<CollectionViewSource x:Key="processList" Source="{Binding Source={x:Static local:MainWindow.ProcessList}}" />      
...     
DataContext="{Binding Source={StaticResource processList}}"
Прямой биндинг на Свойство/Коллекцию:
XML
1
DataContext="{Binding Source={x:Static local:MainWindow.ProcessList}
Парниша видимо не знает, как делать привязку на пользовательские типы, в том числе и массивы.
А потому делает привязку на привязку )).
Надеюсь этот код его научит

C#
1
2
3
4
5
6
7
8
9
  public class A//:System.ComponentModel.INotifyPropertyChanged
    {
        public string OneValue { get; set; }
 
        public string[] GetStrings()
        {
            return new[] { "one", "two", "three" };
        }
    }
HTML5
1
2
3
4
5
6
7
8
9
10
 <Canvas>
            <Canvas.Resources>
                <local:A x:Key="data" OneValue="ONE" />
                <ObjectDataProvider x:Key="dataList" ObjectType="local:A" MethodName="GetStrings" ></ObjectDataProvider>
            </Canvas.Resources>
            <TextBox  Height="23" x:Name="box" 
                      Text="{Binding Source={StaticResource ResourceKey=data}, Path= OneValue }" 
                      Canvas.Left="31" TextWrapping="Wrap"  Canvas.Top="43" Width="120" />
            <ListBox ItemsSource="{Binding Source={StaticResource ResourceKey=dataList}}" Height="100" Width="100" Canvas.Left="31" Canvas.Top="88"/>
        </Canvas>
1
Gromnorg
8 / 8 / 1
Регистрация: 14.03.2013
Сообщений: 22
11.10.2013, 23:35 8
аха, научит как не надо делать...
0
_Mutex
Заблокирован
12.10.2013, 00:00 9
HTML5
1
2
3
4
5
6
7
<TextBox  Height="23" x:Name="box"  
               Text="{Binding Path= OneValue}"        
                      Canvas.Left="31" TextWrapping="Wrap"  Canvas.Top="43" Width="120" >
                <TextBox.DataContext>
                    <local:A   OneValue="ONE" />
                </TextBox.DataContext>            
            </TextBox>
1
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
12.10.2013, 02:38 10
Парниша видимо не знает, как делать привязку на пользовательские типы, в том числе и массивы.
А потому делает привязку на привязку )).
Надеюсь этот код его научит
Упаси господи боже, от такого кода
0
_Mutex
Заблокирован
12.10.2013, 09:41 11
Цитата Сообщение от Konctantin Посмотреть сообщение
Упаси господи боже, от такого кода
Да, да вы не ищете правильных и легких путей. Ответов больше не будет.
0
asutp
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 23
12.10.2013, 10:18  [ТС] 12
Упаси господи боже, от такого кода
аха, научит как не надо делать...
А чего там не так? Парниша старался, писал, а его ругают ))).

Собственно глобально проблема была в том, как обратится в XAML к объекту, который уже объявлен в коде. Этот вариант рабочий
C#
1
2
3
4
5
6
7
8
9
10
<Window x:Class="AIFacePlate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       [B] x:Name="aIFacePlate"[/B]
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="20" Width="100" Name="tbCmdValue"
  [B]DataContext="{Binding ElementName=aIFacePlate, Path=cmd}"[/B]  Text="{Binding Path=Value}" />
    </Grid>
</Window>
0
_Mutex
Заблокирован
12.10.2013, 11:34 13
Цитата Сообщение от asutp Посмотреть сообщение
HTML5
1
2
3
4
5
6
7
8
<Window x:Class="AIFacePlate.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" [B] 
x:Name="aIFacePlate"[/B] Title="MainWindow" Height="350" Width="525"> 
<Grid> 
<TextBox Height="20" Width="100" Name="tbCmdValue" [B]DataContext="{Binding ElementName=aIFacePlate, Path=cmd}"[/B] Text="{Binding Path=Value}" /> 
</Grid> 
</Window>
Зачем заполнять без толку DataContext, наверно знает только автор?
1 А все потому что видимо парень не знает, зачем нужно поле ElementName класса Binding. А нужно оно, если нужно обратиться к элементу в коде XAML.
Так не проще?
HTML5
1
2
<TextBox Height="20" Width="100" Name="tbCmdValue" 
Text="{Binding ElementName=aIFacePlate, Path=Title}" />
2 Если уж вы решили твердо задействовать DataContext, то почему бы не сделать по людски не городя огород:
HTML5
1
2
3
4
5
6
<Canvas >
            <Canvas.DataContext>
                <local:A  OneValue="value" />
            </Canvas.DataContext>          
                <TextBox Height="20" Width="100" Text="{Binding Path=OneValue}" />
        </Canvas>
0
asutp
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 23
12.10.2013, 20:04  [ТС] 14
Если уж вы решили твердо задействовать DataContext, то почему бы не сделать по людски не городя огород:
ОК, по людски пока не получается. Есть класс MainWindow, в котором объявлен объект
C#
1
2
3
4
5
6
7
8
public CmdInterface cmd { get; set; }
        public MainWindow()
        {
            cmd = new CmdInterface();
            InitializeComponent();
            //tbCmdValue.DataContext = cmd; //Вот так работает
            MyControl.SetData(cmd);
        }
Добавлено через 16 минут
Если уж вы решили твердо задействовать DataContext, то почему бы не сделать по людски не городя огород:
ОК, по людски пока не получается. Есть класс MainWindow, в котором объявлен объект
C#
1
2
3
4
5
6
        public CmdInterface cmd { get; set; }
        public MainWindow()
        {
            cmd = new CmdInterface();
            InitializeComponent();
        }
Переходим в XAML и пишем по людски
XML
1
2
3
4
5
<TextBox Height="20" Width="100" x:Name="tbCmdValue"   Text="{Binding Value}" HorizontalAlignment="Left" >
            <TextBox.DataContext>
                <local:MainWindow cmd=""/> //Чего здесь-то писать?
            </TextBox.DataContext>
        </TextBox>
Уже хочется послать XAML ко всем чертям и писать в коде. Уж как-то быстрее и проще для меня получается. Да и C# код можно хоть по человечески отлаживать
0
12.10.2013, 20:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 20:04

Как динамически менять DataContext?
У меня есть в WPF ToolTip у ComboBox, он при запуске программы заполняется из...

Как специфицировать тип DataContext?
Добрый день! Как явно указать тип DataContext, У меня вечно дизайнер VS...

Как привязаться из ItemTemplate к свойству DataContext
Возможно нубский вопрос, но поиск увы не помог. Например, DataContext котрола...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru