Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
.NET 3.x

Затуп с Binding

24.04.2011, 17:19. Показов 2290. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обычное WPF приложение. Пытаюсь прибиндить к TextBlock значение свойства объекта:
App -> Log -> LastLogEntry
У Log реализован INotifyPropertyChanged.
Не знаю как указать путь.
XML
1
2
3
4
5
<TextBlock>
     <TextBlock.Text>
           <Binding ElementName="App.Log" Path="LastEntryText" />
     </TextBlock.Text>
</TextBlock>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2011, 17:19
Ответы с готовыми решениями:

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

Binding
public class ProjectInfo { public List&lt;AHU&gt; ListAHU { get; set; } public string ProjectName { get; set; } ...

Binding x:Name
Доброго времени суток. Подскажите пожалуйста как в Style получить наименование котнрола: Пример: GridView: ...

20
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 18:39
Я б пробовал так делать...
C#
1
<TextBlock DataContext="log:Log" Text="{Binding LastEntryText}"/>
0
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 18:47  [ТС]
А что указывать для log: в xmlns?
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 18:48
в каком пространстве имен находится Log
0
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 18:50  [ТС]
В классе приложения App. А он, в свою очередь, в пространстве имен MainProgram.
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 18:55
вы б выложили свой проект, не весь, можно ключевые моменты
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 19:01  [ТС]
Файл с разметкой (Window_Loading):
XML
1
2
3
4
5
6
7
8
9
10
<Window x:Class="MainProgram.Window_Loading"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MainProgram"
        Title="Запуск приложения"
        Height="150" Width="500" ResizeMode="NoResize" FontSize="14">
    <StackPanel Background="Gainsboro">
        <TextBlock DataContext="?" Text="{Binding ?}"/>
    </StackPanel>
</Window>
Главный класс приложения (App):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace MainProgram
{
    public partial class App : Application
    {
        public LogService Log;
 
        public App()
        {
            Log = new LogService("Logs/");
 
            Window_Loading win = new Window_Loading();
            win.Show();
 
            Log.Write("Тестовая строка. Должна отобразиться в TextBlock'е..");
        }
 
    }
}
Класс единичной записи в лог (LogEntry) и класс логирования (LogService):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
namespace MainProgram
{
    /* Типы сообщений лога:
     * Debug   Отладочная информация
     * Info    Информация о каком-либо событии
     * Warn    Предупреждение
     * Error   Ошибка
     */
    public enum LogLevel
    {
        Debug = 0,
        Info,
        Warn,
        Error,
    }
 
    /* Класс, который описывает единичную запись лога.
     * При создании принимает тип записи в лог LogLevel
     * и текст самой записи.
     */
    public class LogEntry
    {
        public string Text;
        public LogLevel Level;
        public DateTime Time;
        public string LogLevelName
        {
            get { return Enum.GetName(typeof(LogLevel), Level); }
            set { }
        }
 
        public LogEntry(LogLevel Level, string Text)
        {
            this.Text = Text;
            this.Level = Level;
            this.Time = DateTime.Now;
        }
 
        public override string ToString()
        {
            return Time.ToString("dd/MM/yyyy HH:mm:ss") + " [" + LogLevelName + "] " + Text + "\n";
        }
    }
 
    /* Класс для объекта пишущего лог. Записывает в файл и в память. */
    public class LogService : INotifyPropertyChanged
    {
        private FileStream _outFile;
        public List<LogEntry> EntryList;
 
        /* Здесь хранится текст посдений записи в лог для быстрого доступа. */
        private string _LastEntryText;
        public string LastEntryText
        {
            get { return _LastEntryText; }
            set
            {
                _LastEntryText = value;
                OnPropertyChanged("LastEntryText");
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
        }
 
        /* Конструктор класса создает в памяти список
         * и файл для записей лога. Файл, при этом, имеет название
         * текущих времени и даты.
         */
        public LogService(string Folder)
        {
            EntryList = new List<LogEntry>();
 
            if (Folder != String.Empty && Folder != "/" && Folder != "\\")
                Directory.CreateDirectory(Folder);
 
            _outFile = new FileStream(Folder + DateTime.Now.ToString("yyy-MM-dd_HH-mm-ss") + ".txt", FileMode.Create);
            Write(LogLevel.Info, "Запись в лог начата.");
        }
 
        /* Добавляет в лог единичную запись. */
        public void WriteEntry(LogEntry entry)
        {
            EntryList.Add(entry);
            _LastEntryText = entry.Text;
 
            string LogLine = entry.ToString();
            byte[] LogLineBytes = (new UTF8Encoding()).GetBytes(LogLine);
            _outFile.Write(LogLineBytes, 0, LogLineBytes.Length);
        }
 
        /* Добавляет в лог запись с указанным типом и текстом. */
        public void Write(LogLevel logLevel, string text)
        {
            LogEntry entry = new LogEntry(logLevel, text);
            WriteEntry(entry);
        }
 
        /* Добавляет в лог запись с текстом и типом Info. */
        public void Write(string text)
        {
            LogEntry entry = new LogEntry(LogLevel.Info, text);
            WriteEntry(entry);
        }
    }
}
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 19:08
Так по идее должно работать

C#
1
<TextBlock DataContext="local:LogService" Text="{Binding LastEntryText}"/>
0
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 19:10  [ТС]
Нет. Не хочет.
В нормальном коде доступ к свойству должен был бы быть такой:
C#
1
 MainProgram.App.Log.LastEntryText
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 19:29
C#
1
2
3
<StackPanel Background="Gainsboro">
            <TextBlock Text="{Binding LastEntryText}"/>
        </StackPanel>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public App()
    {
      
      Log = new LogService("Logs/");
 
      var win = new MainWindow
                  {
                    DataContext = Log
                  };
      win.Show();
 
      Log.Write("Тестовая строка. Должна отобразиться в TextBlock'е..");
    }
Из App.xaml удалить StartupUri
Миниатюры
Затуп с Binding  
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 19:33  [ТС]
Спасибо. Работает. Но в TextBlock должна отобразиться надпись "Тестовая строка. Должна отобразиться в TextBlock'е..". Почему-то, новое значение LastEntryText не записалось в TextBlock.
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 19:56
Вот такие костыли помогли
C#
1
2
3
4
5
6
7
8
9
10
11
12
/* Добавляет в лог единичную запись. */
    public void WriteEntry(LogEntry entry)
    {
      EntryList.Add(entry);
      _LastEntryText = entry.Text;
 
      OnPropertyChanged("LastEntryText");
 
      string LogLine = entry.ToString();
      byte[] LogLineBytes = (new UTF8Encoding()).GetBytes(LogLine);
      _outFile.Write(LogLineBytes, 0, LogLineBytes.Length);
    }
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 20:00  [ТС]
Спасибо! Навел на мысль.
Я же при добавлении записи в лог присваивал новый текст приватной переменной, а не публичной, у которой есть set с вызывом OnPropertyChanged.

Хотя, все-таки, интересно, как можно обращаться к глубоко закопанным свойствам из WPF разметки. Хотел, в будущем, сделать байндинг множества разных элементов, у которых DataContext разные.
В интернете все примеры для простейших случаев.
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 20:10
да, надо через паблик свойство присваивать новое значение.....

Добавлено через 5 минут
Цитата Сообщение от Exvel Посмотреть сообщение
как можно обращаться к глубоко закопанным свойствам из WPF разметки
лучше пример кода где есть такое, там будет видно...
0
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 20:26  [ТС]
Ну, например, есть два объекта LogService: Log1 и Log2. Оба внутри MainProgram.App. И разметка:
XML
1
2
<TextBlock Text="{Binding Log1.LastLogEntry}" />
<TextBlock Text="{Binding Log2.LastLogEntry}" />
Тут уже нельзя указать DataContext для одного из объектов.
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 20:43
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public App()
    {
      
      Log = new LogService("Logs/");
 
      var win = new MainWindow();
 
      win.textBlock1.DataContext = Log;
      //win.textBlock2.DataContext = Log2;
      win.Show();
 
      Log.Write("Тестовая строка. Должна отобразиться в TextBlock'е..");
    }
Добавлено через 1 минуту
xaml

C#
1
<TextBlock x:Name="textBlock1" Text="{Binding LastEntryText}"/>
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
24.04.2011, 20:44  [ТС]
Ясно. А силами только XAML можно задать такую привязку?
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
24.04.2011, 20:54
не уверен, но все может быть
0
65 / 49 / 10
Регистрация: 03.04.2011
Сообщений: 116
25.04.2011, 19:23
Через ресурсы не пробовал?
Забить класс твой в ресурсы и уже из ресурсов биндить

C#
1
2
3
4
5
6
7
8
9
10
public App()
{
     Log = new LogService("Logs/");
     this.Resources.Add("rLog", log);
 
     Window_Loading win = new Window_Loading();
     win.Show();
 
     Log.Write("Тестовая строка. Должна отобразиться в TextBlock'е..");
}
XML
1
<TextBlock Text="{Binding Path=LastEntryText, Source={StaticResource rLog}}"/>
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
25.04.2011, 20:00  [ТС]
Не знал о такой фичи. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2011, 20:00
Помогаю со студенческими работами здесь

Binding
Добрый день! Подскажите, пожалуйста, можно ли в данном случае свойство Text элемента TextBlock (Text=&quot;Длина участка (км)&quot;)...

Binding ListViewItem Value
XAML: &lt;ListView x:Name=&quot;listView1&quot; IsSynchronizedWithCurrentItem=&quot;True&quot; Grid.Row=&quot;0&quot; Grid.Column=&quot;0&quot;...

Binding по checkbox'y
Пара slider и textbox (связанные между собой по значению), две штуки: &lt;Slider Value=&quot;{Binding...

Binding в DataGrid
Подскажите пожалуйста как прибиндить bool переменную ВыборВсехЗаявок &lt;DataGrid ItemsSource=&quot;{Binding...

Data Binding
Всем привет! Я разбирался с Data Binding. На сайте microsoft написано, что данные должны автоматически обновляться на target'e (в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru