Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 25.10.2017
Сообщений: 15
1

Использование Binding вместо <local:Window.DataContext>

29.10.2017, 11:39. Показов 1180. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

У меня есть форма, которой я хочу присвоить источник данных из AddViewModel.

XML
1
2
3
4
<local:ModalWindow x:Name="newControl1" Margin="650,93,10,0" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="256" Width="Auto">
            <local:ModalWindow.DataContext>
                <local:AddViewModel />
            </local:ModalWindow.DataContext>
Сверху рабочий вариант, но мне нужно, чтобы я могла использовать AddViewModel в коде.
Я создала экземпляр AddViewModel в code behind

C#
1
2
3
4
5
6
7
public AddViewModel CurrentAddView { get; set; }
 
public MainWindow()
        {
            CurrentAddView = new AddViewModel();
            InitializeComponent();
         }
А в XAML окна прописала

XML
1
<local:ModalWindow x:Name="newControl1" Margin="650,93,10,0" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Height="256" Width="Auto" DataContext="{Binding CurrentViewModel}">
(убрала <local:ModalWindow.DataContext>)
Но данные не привязались.
Почему?

код ModalWindow :

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<UserControl x:Class="TestMySQL_DB.ModalWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Width="245.5" Height="278.5">
    <Grid>
            <CheckBox x:Name="checkBox" Content="поле для размерности" HorizontalAlignment="Left" Margin="48,113,0,0" VerticalAlignment="Top"/>
            <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="10,144,0,0" VerticalAlignment="Top" Width="224" ItemsSource="{Binding Path=Dimentions}">
            </ComboBox>
            <Button x:Name="button" Content="Отмена" HorizontalAlignment="Left" Margin="33,239,0,0" VerticalAlignment="Top" Width="76"/>
            <Button x:Name="button_Copy" Content="Добавить" HorizontalAlignment="Left" Margin="135,239,0,0" VerticalAlignment="Top" Width="76"/>
    </Grid>
</UserControl>
AddViewModel:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AddViewModel
    {
        public string Text1;
        public string Text2;
        public bool hasSize;
        public int idSize;
 
        public ObservableCollection<Dimention> Dimentions { get; set; }
 
        public AddViewModel()
        {
            DimentionModel newModel = new DimentionModel();
            Dimentions = new ObservableCollection<Dimention>(newModel.GetAllDimentions());
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2017, 11:39
Ответы с готовыми решениями:

Binding. DataContext. Чортовы Relationships
Доброго дня. Читаю тут примеры по VPF и MVVm &quot;для начинающих&quot; и в каждом вижу то одно, то...

Возможно ли обращение к 2 Window.DataContext(MVVM) из 1 окна
Для каждого DataGrid разработал по своему ViewModel классу но столкнулся с проблемой - DataContext...

Не работает Binding между Window и TextBox
Очередной вопрос к Гуру: никак не могу разобраться с биндингом, вроде бы все делаю по мануалу, но,...

Использование Binding к методу
Доброго времени суток, уважаемые пользователи форума! У меня возникла такая проблема: как правильно...

5
Эксперт .NET
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
29.10.2017, 12:31 2
Цитата Сообщение от Энона Посмотреть сообщение
Но данные не привязались.
Почему?
Потому что {Binding CurrentViewModel} ищет свойство с именем CurrentViewModel не у окна, а у DataContext'а окна. Биндинги привязывают свойства DataContext'а по-умолчанию, если не указан другой Source или ElementName. Поэтому по правильному вам надо определить свойство CurrentViewModel во вью-моделе главного окна.
0
0 / 0 / 0
Регистрация: 25.10.2017
Сообщений: 15
29.10.2017, 13:43  [ТС] 3
Цитата Сообщение от novikov.ea Посмотреть сообщение
Поэтому по правильному вам надо определить свойство CurrentViewModel во вью-моделе главного окна.
У меня было это в главном окне.

Цитата Сообщение от Энона Посмотреть сообщение
public AddViewModel CurrentAddView { get; set; }
public MainWindow()
* * * * {
* * * * * * CurrentAddView = new AddViewModel();
* * * * * * InitializeComponent();
* * * * *}


И при DataContext="{Binding CurrentAddView}" связывания не происходило.
Или вы имели в виду DependencyProperty?
0
Эксперт .NET
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
29.10.2017, 13:50 4
Нет. Я имел ввиду
C#
1
2
3
4
5
6
7
8
public MainWindow()
{
  InitializeComponent();
  DataContext = new MainWindowViewModel()
  {
    CurrentViewModel = new AddViewModel(),
  };
}
0
0 / 0 / 0
Регистрация: 25.10.2017
Сообщений: 15
30.10.2017, 11:06  [ТС] 5
Цитата Сообщение от novikov.ea Посмотреть сообщение
public MainWindow()
{
* InitializeComponent();
* DataContext = new MainWindowViewModel()
* {
* * CurrentViewModel = new AddViewModel(),
* };
}
А-а-а. Я написала
DataContext = this;
И всё ожило. Спасибо.
0
Эксперт .NET
1838 / 1346 / 427
Регистрация: 10.06.2011
Сообщений: 2,126
30.10.2017, 11:37 6
Честно говоря, лучше не задавать окно самому себе в DataContext
C#
1
DataContext = this;
А создать отдельный класс и назвать его с суффиксом ViewModel, как я указал ранее
C#
1
2
3
4
5
6
7
8
public MainWindow()
{
  InitializeComponent();
  DataContext = new MainWindowViewModel()
  {
    CurrentViewModel = new AddViewModel(),
  };
}
Таким образом будет проще соблюдать уровни абстракции в приложении
1
30.10.2017, 11:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2017, 11:37
Помогаю со студенческими работами здесь

Window вместо MessageBox и отправка на него данных
Есть listbox и кнопка отправить. Если в listbox не выбран не один элемент,при нажатии на кнопку...

Не находит в пространстве имен local (Local WPF C# Programming)
Делаю все по этой статье Практическое руководство. Группировка, сортировка и фильтрация данных в...

Передать внутри Binding в ConverterParameter ссылку на окно содержащее объект, который использует Binding
В главном окне в ресурсах есть Контекстные меню. У программы есть &quot;Ручной режим&quot;, если режим тру....

Вызов Window.ShowDialog() срабатывает как Window.Show(), т.е. я могу нажимать на другие окна
Здравствуйте, уважаемые форумчане. Столкнулся с проблемой. У меня есть окно, которое выполняет...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru