Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/50: Рейтинг темы: голосов - 50, средняя оценка - 4.94
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229

Dependency Property и Binding MVVM

31.01.2022, 15:01. Показов 11662. Ответов 108
Метки mvvm (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую, пытаюсь разобраться с тем как привязать DependencyProperty к значению из ViewModel.
Не стал бы этим заниматся если бы не библиотека Material Desing
Суть в том что у кнопки библиотеки есть поле(не уверен что так называется) ButtonProgressAssist.IsIndicatorVisible, оно требует привязку именно к булевому DependencyProperty и просто прибиндится к значению из Viewmodel не получается.
в UserControl на котором есть эта кнопка я создал следующее DependencyProperty.
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public bool ProgressIndicator
        {
            get { return (bool)GetValue(ProgressIndicatorProperty); }
            set { SetValue(ProgressIndicatorProperty, value); }
        }
 
        public static readonly DependencyProperty ProgressIndicatorProperty =
            DependencyProperty.Register(
                "ProgressIndicator",
                typeof(bool),
                typeof(ServerCreationUserControl),
                new PropertyMetadata(false));
Кнопка к нему биндится.
Но вот как прибиндить значение DependencyProperty к полю из View model?
Пытался так:

XML
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
<UserControl x:Class="View.UserControls.ServerCreationUserControl"
             x:Name="SCUserControl"
             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" 
             xmlns:local="clr-namespace:View.UserControls"
             xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d" 
             DataContext="{Binding ServerCreationViewModel, Source={StaticResource Locator}}"
             d:DesignHeight="650" d:DesignWidth="930">
    
    <Grid>
        
        <local:ServerCreationUserControl 
            ProgressIndicator="{Binding CreationStatus,
            Converter={StaticResource CreationStatusToBool}}">
        </local:ServerCreationUserControl>
 
        <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
            <TextBox 
                md:HintAssist.Hint="Имя директории сервера"
                FontSize="22"
                Text=""/>
            <Button
                Margin="0,50,0,0"
                Background="{Binding CreationStatus, Converter={StaticResource ConnectionToColor}}"
                Style="{StaticResource MaterialDesignFloatingActionButton}"
                md:ButtonProgressAssist.IsIndicatorVisible="{Binding  ProgressIndicator, ElementName=SCUserControl}"
                md:ButtonProgressAssist.Value="-1"
                md:ButtonProgressAssist.IsIndeterminate="True"
                Content="{md:PackIcon DotsHorizontal}"
                IsEnabled="true" Cursor="Hand" />
        </StackPanel>
    </Grid>
</UserControl>
Конвертер(Enum):
C#
1
2
3
4
5
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var val = (CreationStatus)value;
            return val == CreationStatus.InProgress;
        }
По итогу получил StackOverflow. Собственно в этом и вопрос как правильно тогда сделать привязку?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2022, 15:01
Ответы с готовыми решениями:

Data binding by nested property
Всем доброго времени суток! Вопрос такой. Есть textbox(TrigerTorque) во view, которому надо присвоить следующее значение...

Binding StringBuilder MVVM
не получается обновить свойства, текст добавляется но не обновляется при выполнении StringBuilder.Append. в Mode значение TwoWay. если...

MVVM, непонятки c binding-ом
WPF + MVVM light Не работает связывание свойств ViewModel с View. При открытии формы отрабатывает локатор - это видно по логам и...

108
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
06.02.2022, 18:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Взял, тут UC выбирается через ListBox, а если например по клику кнопки сделать?
А какая разница?
Content="{Binding SelectedItem, ElementName=listBox}" привяжите к любому свойству.
Я использовал ListBox, чтобы не создавать ещё и VM, поскольку для данного примера это излишне.
Он просто играет роль источника значения.
В лоике он совершенно не участвует.
Вы задайте свой источник.

Добавлено через 2 минуты
enum тоже здесь только для примера, поскольку вы сказали, что у вас он используется.
Используйте вместо него просто строки "0", "1", "2", "3" - всё будет работать точно также.
1
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
13.03.2022, 23:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
привяжите к любому свойству.
Вы имеете ввиду привязать к свойству во ViewModel?
Если я правильно понял то тогда кнопкой мы триггерим команду которая будет менять свойство в VM к которому мы привязываем ContentPresenter, а тот в свою очередь будет отображать указанный UserControl
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 00:32
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Вы имеете ввиду привязать к свойству во ViewModel?
В том числе.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
кнопкой мы триггерим команду которая будет менять свойство в VM к которому мы привязываем ContentPresenter
В том числе можно и так.
Зависит от того какой UI реализуете.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 02:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
присваивает Контекст Данных ему это ваш ContentControl.
Пытаюсь разобраться с DataContext для UC.
Есть главное окно в котором переключаются UC с помощью кнопок, главное окно видит DataContext, а UC нет.

Код главного окна (всеми UC заведует ContentControl)
XML
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<Window x:Class="View.Views.SettingsWindowView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ext="clr-namespace:View.Extension"
        xmlns:views="clr-namespace:View.Views"
        xmlns:enm="clr-namespace:Common.Enums;assembly=Common"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="500" Width="450"
        ResizeMode="NoResize"
        WindowStartupLocation="CenterOwner"
        WindowStyle="None"
        AllowsTransparency="True"
        Topmost="True"
        DataContext ="{Binding SettingsViewModel, Source={StaticResource Locator}}"
        Background="Transparent" 
        MouseLeftButtonDown="Window_MouseLeftButtonDown">
    <Window.Resources>
        <ext:TemplateSelector x:Key="Selector">
            <DataTemplate x:Key="{x:Static enm:Pages.MainPage}">
                <views:SettingsMainPageUserControl/>
            </DataTemplate>
            <DataTemplate x:Key="{x:Static enm:Pages.ProcessesPage}">
                <views:ProcessesPageUserControl/>
            </DataTemplate>
            <DataTemplate x:Key="{x:Static enm:Pages.OtherSettingsPage}">
                <views:OtherSettingsPageUserControl/>
            </DataTemplate>
        </ext:TemplateSelector>
    </Window.Resources>
    <Border CornerRadius="10" Background="#FF292929">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="12*" />
                <ColumnDefinition Width="77*" />
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Border 
                Background="White" 
                CornerRadius="5" 
                Grid.Column="1" Margin="0,5,0,5">
                <Grid>
                    <Grid VerticalAlignment="Top" HorizontalAlignment="Center" Height="55" Width="355" Margin="0,435,0,0">
                        <Button
                            Width="80"
                            Height="40"
                            HorizontalAlignment="Left"
                            Style="{StaticResource LightGrayButton}"
                            Content="{DynamicResource Loc_Reset}" Cursor="Hand">
                        </Button>
                        <Button
                            Width="80"
                            Height="40"
                            HorizontalAlignment="Center"
                            Style="{StaticResource LightGrayButton}"
                            Content="{DynamicResource Loc_Cancel}">
                        </Button>
                        <Button
                            HorizontalAlignment="Right"
                            Width="80"
                            Height="40"
                            Style="{StaticResource LightGrayButton}"
                            Content="{DynamicResource Loc_Apply}">
                        </Button>
                    </Grid>
 
 
                    <ContentControl 
                        Content="{Binding CurrentPage, UpdateSourceTrigger=PropertyChanged}" 
                        ContentTemplateSelector="{DynamicResource Selector}"
                        Margin="15,15,15,55"/>
 
 
                </Grid>
            </Border>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="228*"/>
                    <RowDefinition Height="45*"/>
                    <RowDefinition Height="227*"/>
                </Grid.RowDefinitions>
                <ComboBox
                    VerticalAlignment="Top"
                    Width="45" Height="45"
                    SelectedIndex="{Binding SelectedLangIndex}"
                    ItemContainerStyle="{StaticResource PictureComboBoxItemStyle}" 
                    Style="{StaticResource PictureComboBoxStyle}" Margin="0,7,0,0">
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagEng}"/>
                    </ComboBoxItem>
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagRus}"/>
                    </ComboBoxItem>
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagChn}"/>
                    </ComboBoxItem>
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagSpa}"/>
                    </ComboBoxItem>
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagUae}"/>
                    </ComboBoxItem>
                    <ComboBoxItem>
                        <Image Width="41" Height="26" Source="{StaticResource FlagFra}"/>
                    </ComboBoxItem>
                </ComboBox>
                <Button
                    Width="45" Height="45"
                    VerticalAlignment="Bottom"
                    Style="{StaticResource BlackButton}"
                    Command="{Binding SetPage, Mode=OneWay}" Margin="0,0,0,5"
                    CommandParameter="{x:Static enm:Pages.MainPage}">
                    <Image Width="35" Height="35" Source="{StaticResource Main}"/>
                </Button>
                <Button
                    Style="{StaticResource BlackButton}"
                    Width="45" Height="45"
                    VerticalAlignment="Center" 
                    Margin="8,0,7,0" Grid.Row="1"
                    Command="{Binding SetPage, Mode=OneWay}" 
                    CommandParameter="{x:Static enm:Pages.ProcessesPage}">
                    <Image Width="35" Height="35" Source="{StaticResource Process}"/>
                </Button>
                <Button
                    Style="{StaticResource BlackButton}"
                    Width="45" Height="45"
                    VerticalAlignment="Top"
                    Grid.Row="2" 
                    Margin="0,5,0,0" 
                    Command="{Binding SetPage, Mode=OneWay}" 
                    CommandParameter="{x:Static enm:Pages.OtherSettingsPage}">
                    <Image Width="35" Height="35" Source="{StaticResource Other}"/>
                </Button>
                <Button
                    Style="{StaticResource BlackButton}"
                    VerticalAlignment="Bottom"
                    HorizontalAlignment="Center"
                    Width="45" Height="45"
                    Command="{Binding OpenInformationWindowCommand, Mode=OneWay}" Grid.Row="2" Margin="0,0,0,7">
                    <Image Width="35" Height="35" Source="{StaticResource Info}"/>
                </Button>
            </Grid>
        </Grid>
    </Border>
</Window>
Код одного из UC

XML
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
<UserControl x:Class="View.Views.ProcessesPageUserControl"
             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"
             d:DesignHeight="410" d:DesignWidth="350"
             d:DataContext ="{Binding MainWindowViewModel, Source={StaticResource Locator}}"
             Background="Transparent">
    <Grid>
        <CheckBox
            Height="25"
            Style="{StaticResource SliderCheckBox}"
            x:Name="FullScreenCheckBox"
            Content="{DynamicResource Loc_DontWorkInFullScreen}" 
            VerticalContentAlignment="Center"
            IsChecked="{Binding CheckFullScreenApps, Mode=TwoWay}" Grid.Row="1" Margin="0,0,0,385"/>
        <ListBox
            BorderThickness="0"
            IsEnabled="{Binding IsChecked, ElementName=FullScreenCheckBox}"
            SelectionMode="Multiple"
            ItemsSource="{Binding Processes, Mode=OneWay}" Grid.Row="1" d:ItemsSource="{d:SampleData ItemCount=5}" Margin="0,55,0,0">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem" BasedOn="{StaticResource ProcessListBoxItem}">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox
                        VerticalContentAlignment="Center" HorizontalContentAlignment="Left"
                        HorizontalAlignment="Center" VerticalAlignment="Center"
                        IsChecked="{Binding IsSelected}"
                        Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.MoveToIgnoredProcesses, Mode=OneWay}"
                        Content="{Binding DisplayedText, Mode=OneWay}">
                    </CheckBox>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox
            Height="25"
            FontSize="14"
            Text="{DynamicResource Loc_ProcessesWhiteList}"
            Grid.Row="1" Cursor="Arrow" Margin="0,30,0,355"/>
        <Button 
            Command="{Binding RefreshApplicationsList, Mode=OneWay}"
            Style="{StaticResource RotaryButton}"
            IsEnabled="{Binding IsChecked, ElementName=FullScreenCheckBox}"
            HorizontalAlignment="Right" VerticalAlignment="Top" 
            Width="25" Height="20" Grid.Row="1" Margin="0,34,0,0" >
            <Image Source="{StaticResource Refresh}" Height="20"/>
        </Button>
    </Grid>
</UserControl>
В App.xaml прописан DataTemplate для главного окна
XML
1
2
3
            <DataTemplate DataType="{x:Type vm:SettingsViewModel}">
                <views:SettingsWindowView/>
            </DataTemplate>
Искренне не понимаю почему DataContext не подхватывается UserControl'ами
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 11:58
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Искренне не понимаю почему DataContext не подхватывается UserControl'ами
Какой DataContext?
Если правильно понял, то регион страниц у вас представляет вот этот ContentControl:
XML
70
71
72
73
    <ContentControl 
        Content="{Binding CurrentPage, UpdateSourceTrigger=PropertyChanged}" 
        ContentTemplateSelector="{DynamicResource Selector}"
        Margin="15,15,15,55"/>
В таком случае DataContext ваших UC будет свойство CurrentPage.
Но судя по XAML UC d:DataContext ="{Binding MainWindowViewModel, вы ожидаете там что-то иное.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
В App.xaml прописан DataTemplate для главного окна
И на что вы рассчитываете задав его?
Ведь в Окне вы задаете в Контент Окна UI содержание и к нему будет применяться Шаблон Данных.

Добавлено через 5 минут
И мне не вполне ясно как у вас устроена архитектура данных на уровне View.
В Окне у вас Контекст Данных это SettingsViewModel.
Регион страниц у вас представляет свойство CurrentPage Контекста Данных Окна.
И вы там ожидаете MainWindowViewModel из Локатора.
Какая-то дикая каша....

Добавлено через 6 минут
По идее, если вы используете страничную навигацию, то Контекстом Данных у вас должен быть Навигатор - которого я вообще не вижу в вашем коде.
И когда используется Навигатор, то задавать отдельно Локатор не имеет смысла - это только путает решение.
Функционал Локатора надо реализовывать в Навигаторе, по сути Навигатор - это Локатор с расширенным функционалом.

Но у вас же явно SettingsViewModel - это не Навигатор.
Или вы в нём реализовали свойство CurrentPage и переключение страниц.

Если можете дайте ссылку на Гит с этим решением - слишком много неясностей в выложенном вами коде.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 12:29  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если можете дайте ссылку на Гит с этим решением
Тык
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 13:16
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Тык
Приглашение на него скиньте.

Добавлено через 1 минуту
xr_Sanya, в проекте View есть ссылка на папку "Enums", но в Репозитории её нет.
Выдаёт ошибку.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 13:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
в проекте View есть ссылка на папку "Enums", но в Репозитории её нет.
Выдаёт ошибку.
Поправил и дал доступ
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 13:28
Цитата Сообщение от xr_Sanya Посмотреть сообщение
XML
12
13
14
            <DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
                <views:MainWindow/>
            </DataTemplate>
Как вы представляете работу этого Шаблона?
Шаблон данных применяется к содержимому (Content) UI элемента.
Соответственно, содержимое Шаблона никак не может быть верхним элементом визуального дерева.
Но Окно может быть только верхним элементом визуального дерева.

Добавлено через 5 минут
xr_Sanya, я сделал маленькую фиксацию - синхронизируйтесь
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 13:30  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как вы представляете работу этого Шаблона?
Если честно то никак не представляю, просто в обучающем ролике видел что это используют
Как я понимаю это тоже самое что самому задать свойство Content к UI элементу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 13:56
Цитата Сообщение от xr_Sanya Посмотреть сообщение
C#
19
20
21
22
23
24
25
26
27
        public App()
        {
            ConfigureIoC();
            InitializeComponent();
 
            IoC.GetInstance<IAppSettingsModel>().Load();
            var asd = new MainWindow();
            asd.Show();
        }
Так нельзя делать.
Прочитайте: Ресурсы приложения и запуск основного окна из Code-Behind App

Добавлено через 1 минуту
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Как я понимаю это тоже самое что самому задать свойство Content к UI элементу.
Суть в том что в Шаблоне нельзя использовать Window.
Window должен быть всегда верхним элементом, а Шаблон априори всегда не верхний элемент.

Добавлено через 7 минут
Фиксацию отправил.

Добавлено через 5 минут
Задавать СB словарю ресурсов - тоже плохая затея.
Оно как бы работает, но не всегда и не всюду
В Дизайнере точно будут возникать ошибки и предупреждения.

Добавлено через 8 минут
xr_Sanya, DataContext у UserConrol'ов нормально переключается.
Вы, наверное, просто не его ожидаете.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 14:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
DataContext у UserConrol'ов нормально переключается.
Вы, наверное, просто не его ожидаете.
На данном этапе в настройках должны появляться мониторы к пк подключённые, но они не появляются, если в XAML UC указать datacontext то их видно. Поэтому и ссылаюсь на него.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
В Дизайнере точно будут возникать ошибки и предупреждения.
Действительно возникают, но другого решения для локализации покачто не придумал. Локализацию через студию не хочу делать (планируется что приложение будет собиратся в один exe, а папки так не собрать без стороннего софта)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 14:38
xr_Sanya, например возьмём OtherSettingsPageUserControl:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<UserControl x:Class="View.Views.OtherSettingsPageUserControl"
             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"
             d:DesignHeight="410" d:DesignWidth="350"
             d:DataContext ="{Binding MainWindowViewModel, Source={StaticResource Locator}}"
             Background="Transparent">
    <Grid>
        <StackPanel Orientation="Vertical">
            <CheckBox
                Style="{StaticResource SliderCheckBox}"
                Content="{DynamicResource Loc_AutoLaunch}"
                IsChecked="{Binding LaunchOnStartup, Mode=TwoWay}"/>
В режиме разработки у вас в Контексте Данных MainWindowViewModel, а в рунтайм у вас там значение перечисления Pages.OtherSettingsPage.

И какого-то понимания, что вы там ожидаете в действительности увидеть - нет.
Так, например, свойства LaunchOnStartup к которому вы задаёте привязку я не нашёл ни одного типа.

Добавлено через 2 минуты
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Действительно возникают, но другого решения для локализации покачто не придумал.
Просто вынесите CB словаря в отдельный тип.
Назовите его, допустим, Локализатор, сделайте его производным от Freezable и объявите в нём нужные вам DP-свойства.

Добавлено через 4 минуты
У вас же локализация происходит один раз при запуске приложения или может динамически меняться во время сеанса работы приложения?
Если первое, то сделайте ещё проще - в XAML App записывайте в MergedDictionaries словарь с локализацией по умолчанию.
А в OnStartup заменяйте его на нужную вам локализацию.

Добавлено через 8 минут
xr_Sanya, истоки проблемы, скорее всего, что вы из VM SettingsViewModel захотели сделать UI Навигатор.
Но это функция View и перенос её на уровень ниже запутало всю логику.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 14:48  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В режиме разработки у вас в Контексте Данных MainWindowViewModel, а в рунтайм у вас там значение перечисления Pages.OtherSettingsPage.
И какого-то понимания, что вы там ожидаете в действительности увидеть - нет.
Был проект в котором были неправильно сделаны модель и вью модель, я выдрал оттуда вьюшки и вставил в этот проект, доделать не успел, поэтому и остались ошибки.
У всех UC DataContext должен быть SettingsViewModel, просто не добрался до туда еще.
Покачто озабочен SettingsMainPageUserControl, так как он не отображает мониторы если явно ему не указать DataContext

Добавлено через 8 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
истоки проблемы, скорее всего, что вы из VM SettingsViewModel захотели сделать UI Навигатор.
Но это функция View и перенос её на уровень ниже запутало всю логику.
Возможно, я просто не понимаю как навигацию сделать.
Я у вас про это спрашивал, сделал как понял

Если вкратце то при клике на кнопку меняется UC, путем команды.
Команда меняет свойство CurrentPage которое находится в SettingsViewModel.
Это свойство слушает ContentControl который исходя из CurrentPage подставляет нужный UC.
TemplateSelector окна с помощью класса Extensions/TemplateSelector соотносит CurrentPage с UC.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 15:00
xr_Sanya, вот пример UI Навигатора:
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
using Common.Infrastructure.Commands;
using System.Windows;
using System.Windows.Controls;
 
namespace View.Views
{
    public partial class SettingsNavigator : Freezable
    {
        protected override Freezable CreateInstanceCore()
        {
            throw new System.NotImplementedException();
        }
    }
    public partial class SettingsNavigator
    {
 
        /// <summary>
        /// Текущее представление.
        /// </summary>
        public UserControl Current
        {
            get { return (UserControl)GetValue(CurrentProperty); }
            set { SetValue(CurrentProperty, value); }
        }
 
        /// <summary><see cref="DependencyProperty"/> для свойства <see cref="Current"/>.</summary>
        public static readonly DependencyProperty CurrentProperty =
            DependencyProperty.Register(nameof(Current), typeof(UserControl), typeof(SettingsNavigator), new PropertyMetadata(null));
 
        public RelayCommand SetCurrent { get; }
 
        public SettingsNavigator()
        {
            SetCurrent = new RelayCommand(SetCurrentExecute, SetCurrentCanExecute);
        }
 
        private bool SetCurrentCanExecute(object parameter)
        {
            return parameter == null || parameter is UserControl;
        }
 
        private void SetCurrentExecute(object parameter)
        {
            Current = (UserControl) parameter;
        }
    }
}
Сделал фиксацию с примером его использования....
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
14.03.2022, 16:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сделал фиксацию с примером его использования....
Подскажите пожалуйста по нескольким моментам
Вы поменяли в Window.Resources способ переключение между UC, в чем была проблема того?
И установили DataContext для каждого UC, вроде же говорили что для UC ненадо устанавливать DataContext?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
14.03.2022, 17:02
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Вы поменяли в Window.Resources способ переключение между UC, в чем была проблема того?
Я же объяснял выше.
Вы задавили разные представления для РАЗНЫХ типов данных. Я уже не говорю за экземпляр с данными.
А вам нужно переключать представления безотносительно безотносительно самих данных.
Экземпляры данных у вас по сути константны и не изменяются - это свойства локатора.
В том числе даже для одного и того же экземпляра данных вам нужно задавать разные представления.
И эти переключения представления никак не связанны в Моделью и следовательно это не должно реализовываться на уровне VM.

Цитата Сообщение от xr_Sanya Посмотреть сообщение
И установили DataContext для каждого UC, вроде же говорили что для UC ненадо устанавливать DataContext?
В данном случае у вас на UС реализовано константное представление и у каждого UC только один экземпляр.
По "феншую" их следует сделать Синглтоном.
Так же в такой реализации не создаётся экземпляр для DataContext, а получается от внешнего локатора - поэтому возможность управления им остаётся.

Что бы сделать совсем без Контекста Данных, то его придётся задавать из вне.
Если бы он был общий у всех или для каждого типа свой - это было бы просто
Но у вас он смешанный - и логика зависимости путанная. Реализовывать её на уровне View как-то тоже не с руки.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.04.2022, 21:35  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Просто вынесите CB словаря в отдельный тип.
Назовите его, допустим, Локализатор, сделайте его производным от Freezable и объявите в нём нужные вам DP-свойства.
У вас же локализация происходит один раз при запуске приложения или может динамически меняться во время сеанса работы приложения?
Если первое, то сделайте ещё проще - в XAML App записывайте в MergedDictionaries словарь с локализацией по умолчанию.
А в OnStartup заменяйте его на нужную вам локализацию.
Вы имели ввиду сделать freezable класс со всеми строками локализации в виде DP свойств? Можно ли это упростить? Если у меня много строк, то для каждой прописывать DP свойство муторное дело.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
04.04.2022, 21:40
Цитата Сообщение от xr_Sanya Посмотреть сообщение
Вы имели ввиду сделать freezable класс со всеми строками локализации в виде DP свойств?
Нет.
Там будут только свойства для значений которые вы используете в CB словаря.
И в их логике заменять на нужный словарь в App.
0
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
04.04.2022, 21:45  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там будут только свойства для значений которые вы используете в CB словаря.
Тоесть DP свойство отображающее текущую строку локализации? Сути это не меняет или я не понимаю что вы имеете ввиду.
Я пишу про локализацию в рантайме, вариант со словарями под разные языки мне понятен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2022, 21:45

Mvvm binding и DataContext
Доброго времени суток. Подскажите пожалуйста, обязательно ли в коде инициализировать DataContext = new *и имя viewmodel*; Вычитал что...

Binding данных со связями MVVM
Как за биндить связанные данные ? я только начинаю осваивать эту технологию &lt;Grid Grid.Column=&quot;0&quot;&gt; ...

Binding позиции мыши MVVM
Не так давно делал простенький музыкальный плеер,а сейчас решил сделать уже более серьезную версию плеера с фонотекой , использованием...

MVVM, Command, ContextMenu Binding
Доброго времени суток. Столкнулся с проблемой. Имеется внутри View &lt;ListBox.ItemTemplate&gt; ...

Binding RichTextBox using MVVM WPF
Добрый вечер, друзья. А как у нас обстоят дела с биндингом ричтекстбокса на паттерне mvvm? По аналогии с текстбоксом, сделать...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru