powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Присвоение в XAML значения сложному свойству
7 сообщений из 7, страница 1 из 1
Присвоение в XAML значения сложному свойству
    #39810387
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим, если у меня есть такие классы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public class ComplexPropertyClass
    {
        public string SimpleProperty { get; set; }
        public TwoPropertyClass ComplexProperty { get; set; } = new TwoPropertyClass();
    }
  public  class TwoPropertyClass
    {
        public string First { get; set; }
        public string Second { get; set; }
    }



То инициализировать в XAML я его могу только так?
Код: xml
1.
2.
3.
4.
5.
6.
7.
        <StackPanel.DataContext>
            <local:ComplexPropertyClass SimpleProperty="SimpleProperty">
                <local:ComplexPropertyClass.ComplexProperty>
                    <local:TwoPropertyClass First="First" Second="Second"/>
                </local:ComplexPropertyClass.ComplexProperty>
            </local:ComplexPropertyClass>
        </StackPanel.DataContext>



Следовательно убрать сеттер ComplexProperty я не могу?
Код: c#
1.
2.
3.
4.
5.
    public class ComplexPropertyClass
    {
        public string SimpleProperty { get; set; }
        public TwoPropertyClass ComplexProperty { get; } = new TwoPropertyClass();
    }



Или есть возможность присвоения значения без создания нового экземпляра TwoPropertyClass?
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39810401
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspИли есть возможность присвоения значения без создания нового экземпляра TwoPropertyClass?нет. Если ничего не путаю, классы создаются от веток к корню, так что будет создан сначала вложенный класс
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39810408
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspИли есть возможность присвоения значения без создания нового экземпляра TwoPropertyClass?нет. Если ничего не путаю, классы создаются от веток к корню, так что будет создан сначала вложенный класс
Вложенный объект уже создан в конструкторе.
Вопрос в том как свойствам этого объекта присвоить значения в XAML.

То есть в C# я могу без проблем написать так
Код: c#
1.
2.
3.
4.
    ComplexPropertyClass obj = new ComplexPropertyClass();
    obj.SimpleProperty = "SimpleProperty";
    obj.ComplexProperty.First = "First";
    obj.ComplexProperty.Second = "Second";



А в XAML мне приходится писать так (если перевести на C#)
Код: c#
1.
2.
3.
4.
5.
            ComplexPropertyClass obj = new ComplexPropertyClass();
            obj.SimpleProperty = "SimpleProperty";
            obj.ComplexProperty = new TwoPropertyClass();
            obj.ComplexProperty.First = "First";
            obj.ComplexProperty.Second = "Second";


Появляется лишняя строчка
Код: plaintext
obj.ComplexProperty = new TwoPropertyClass();

А вопрос появился из-за того, что мне не нужен сеттер в свойстве ComplexProperty. Даже не просто не нужен, а мешает, так как из-за этого приходится отслеживать возможность замены на другой объект, что и происходит при инициализации в XAML.
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39810591
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гугли MarkupExtension
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39812204
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesгугли MarkupExtensionПару дней потратил чтобы понять как использовать, но.... не доходит.

Если классы определены так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public class ComplexPropertyClass
    {
        public string SimpleProperty { get; set; }
        public TwoPropertyClass ComplexProperty { get;} = new TwoPropertyClass();
    }
    public  class TwoPropertyClass
    {
        public string First { get; set; }
        public string Second { get; set; }
    }


То каким образом в XAML для экземпляра ComplexPropertyClass можно задать значения свойствам First и Second свойства TwoPropertyClass ?
Ведь оно же только для чтения и не принимает даже MarkupExtension?

Или у не так делаю...?
Если можете - подтолкните в нужном направлении ещё чуток.
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39812228
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задать так, как вы хотите, не получится, ведь MarkupExtension предполагает, что будет возвращено какое то значение, которое будет присвоено заданному свойству, но можно сделать небольшой трюк. Не самое изящное решение, но рабочее.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Grid>
    <Grid.DataContext>
        <local:ComplexPropertyClass  SimpleProperty="SimpleValue"
                                        ComplexProperty="{local:Complex Value1, Value2}">
                
        </local:ComplexPropertyClass>
    </Grid.DataContext>
    <StackPanel>
        <TextBlock Text="{Binding SimpleProperty}"/>
        <TextBlock Text="{Binding ComplexProperty.First}"/>
        <TextBlock Text="{Binding ComplexProperty.Second}"/>
    </StackPanel>
</Grid>


Код: 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.
public class ComplexPropertyClass
{
    public string SimpleProperty { get; set; }

    private readonly TwoPropertyClass _complexProperty = new TwoPropertyClass();
    public TwoPropertyClass ComplexProperty
    {
        set { }
        get => _complexProperty;
    }
}

public class TwoPropertyClass
{
    public string First { get; set; }
    public string Second { get; set; }
}

public class Complex : MarkupExtension
{
    private readonly string _first;
    private readonly string _second;

    public Complex (string first, string second)
    {
        _first = first;
        _second = second;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (serviceProvider is IProvideValueTarget target
            && target.TargetObject is ComplexPropertyClass complex)
        {
            complex.ComplexProperty.First = _first;
            complex.ComplexProperty.Second = _second;
        }
        return null;
    }
}



другой вариант:

Код: xml
1.
2.
3.
4.
5.
6.
7.
<Grid DataContext="{local:ComplexClass SimpleValue11, {local:TwoProperty Value111, Value211}}">
    <StackPanel>
        <TextBlock Text="{Binding SimpleProperty}"/>
        <TextBlock Text="{Binding ComplexProperty.First}"/>
        <TextBlock Text="{Binding ComplexProperty.Second}"/>
    </StackPanel>
</Grid>



Код: 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.
ublic class ComplexPropertyClass
{
    public ComplexPropertyClass(string simple, TwoPropertyClass complex)
    {
        SimpleProperty = simple;
        ComplexProperty = complex;
    }
    public string SimpleProperty { get; set; }
    public TwoPropertyClass ComplexProperty { get; }
}

public class TwoPropertyClass
{
    public string First { get; set; }
    public string Second { get; set; }
}

public class TwoProperty : MarkupExtension
{
    private readonly TwoPropertyClass _twoProperty;

    public TwoProperty(string first, string second)
    {
        _twoProperty = new TwoPropertyClass() { First = first, Second = second };
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return _twoProperty;
    }
}

public class ComplexClass : MarkupExtension
{
    private readonly ComplexPropertyClass _returnValue;
    public ComplexClass(string simpleValue, TwoPropertyClass complexValue)
    {
        _returnValue = new ComplexPropertyClass(simpleValue, complexValue);
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return _returnValue;
    }
}
...
Рейтинг: 0 / 0
Присвоение в XAML значения сложному свойству
    #39812302
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesзадать так, как вы хотите, не получится, ведь MarkupExtension предполагает, что будет возвращено какое то значение, которое будет присвоено заданному свойству, но можно сделать небольшой трюк. Не самое изящное решение, но рабочее.

Ясность полная!
Спасибо!
Получается или надо открывать сеттер или делать MarkupExtension на весь класс, а не только на само свойство только для чтения.

Ещё раз спасибо!
Вы как всегда на высоте - полно и ясно объясняете!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Присвоение в XAML значения сложному свойству
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]