Свойство WPF Control Style Setter, соответствующее элементу в серии - PullRequest
0 голосов
/ 17 марта 2020

В настоящее время я работаю над приложением. NET 4.7, использующим WPF и средства управления инфраструктурой.

Мне нужно установить With, Height, YMemberPath и XMemberPath каждого элемент в соответствии с каждым элементом в списке источников данных.

Я использую диаграмму XamDataChart, которая показывает несколько точек из List<ChartData>. Класс ChartData выглядит следующим образом:

public class ChartData
{
    public double Width { get; set; }

    public double Height { get; set; }

    public double XPos { get; set; }
    public double YPos { get; set; }
}

На данный момент значения установлены в конструкторе моей ViewModel:

ChartData data = new ChartData
{
    Width = 400,
    Height = 200,
    XPos = 100,
    YPos = 100
};

Мой XAML выглядит следующим образом:

<ig:XamDataChart.Series>
    <ig:ScatterSeries
        MarkerType="Square"
        ItemsSource="{Binding ChartDataList}"
        YMemberPath="YPos"
        XMemberPath="XPos"
        XAxis="{Binding ElementName=XAxis}"
        YAxis="{Binding ElementName=YAxis}">
        <ig:ScatterSeries.MarkerStyle>
            <Style TargetType="{x:Type ig:Marker}">
                <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, FallbackValue=20}"/>
                <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, FallbackValue=20}"/>
            </Style>
        </ig:ScatterSeries.MarkerStyle>
    </ig:ScatterSeries>
</ig:XamDataChart.Series>

К сожалению, мои элементы не будут отображаться правильно, и я не знаю, что я делаю неправильно.

Установщики ширины и высоты в разделе стиля маркера не соблюдаются при все.

У вас есть идеи, как решить эту проблему?

Мне нужно нарисовать каждый элемент без полей или отступов в XPos и ​​YPos с правильной высотой и шириной.

Спасибо большое !!

1 Ответ

1 голос
/ 17 марта 2020

Я думаю, вам нужно реализовать уведомление об изменении свойства. Когда исходные значения ширины и высоты определены и установлены или изменены, вам необходимо уведомить цель об этом изменении. Это позволит вам узнать, как это сделать: Уведомление об изменении .

По сути, вам нужно реализовать INotifyPropertyChanged и вызывать OnPropertyChanged () для каждого свойства при изменении значения

Редактировать 1: Я не следую , Вы используете привязку для высоты и ширины. Это означает, что вы хотите, чтобы эти значения обновлялись во время нормальной работы. Если это не правильно, просто используйте жестко закодированные значения.

Кроме того, ваши значения не соблюдаются, поскольку они устанавливаются в конструкторе, который запускается после инициализации пользовательского интерфейса. Без уведомления об изменениях значения в конструкторе не будут соблюдаться (поэтому они не устанавливаются должным образом при запуске).

Вы можете инициализировать свои значения в их определении, например:

public double Width { get; set; } = 400;

Это значение применяется во время инициализации и должно применяться к исходному макету пользовательского интерфейса во время запуска - однако без уведомления об изменении это становится постоянным c (неизменным) значением.

Однако вам необходимо исправить привязку. Ваша привязка относится к RelativeSource, но привязана к самой себе. Это означает, что вы привязываете ширину элемента управления к себе. Вам необходимо привязаться к источнику данных, используя ElementName = и путь к фактическому элементу данных, например, Path = data.Width. Это приблизительное значение, поскольку вашему коду недостаточно для понимания всей картины. Однако, опять же, без уведомления об изменениях, изменения в data.Width не будут обновляться.

Редактировать 2 : Вы также можете обновить значения «традиционным» способом. То есть используйте имя элемента управления и имя свойства и установите значение в коде. При этом Привязка будет игнорироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...