Связываю следующим образом:

views:SciChartUserControl Name="SciChartUserControl" Quotes="{Binding QuoteCollection}"></views:SciChartUserControl>

Я точно знаю, что QuoteCollection обновляется, потому что сетка также привязывается к нему, и я вижу его обновленным. Я хочу получать уведомления в коде программной части моего представления SciChartUserControl, но QuotesPropertyChanged никогда не вызван. Это сводит меня с ума, я много часов пробовал разные способы ... что-то очевидное, что я упускаю?

public partial class SciChartUserControl : UserControl
{
    private SciChartControlViewModel _viewModel;

    public SciChartUserControl()
    {

        //Set ViewModel Datacontext
        _viewModel = new SciChartControlViewModel();
        DataContext = _viewModel;

        InitializeComponent();
    }

    public static DependencyProperty QuotesProperty = DependencyProperty.Register("Quotes", typeof(List<Quote>), typeof(SciChartUserControl), new PropertyMetadata(QuotesPropertyChanged));

    public List<Quote> Quotes
    {
        get
        {
            return (List<Quote>)GetValue(QuotesProperty);
        }

        set
        {
            SetValue(QuotesProperty, value);
        }
    }

    private static void QuotesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        throw new NotImplementedException();

        var quotes = (List<Quote>) e.NewValue;
    }



}

РЕДАКТИРОВАТЬ : я добавил часть представления, в котором размещен SciChartUserControl.

 <dxdo:LayoutPanel Caption="Time Series Visualization">

                        <views:SciChartUserControl Name="SciChartUserControl" Quotes="{Binding QuoteCollection}"></views:SciChartUserControl>

                    </dxdo:LayoutPanel>

                    <dxdo:LayoutPanel Caption="Time Series Data">
                        <dxg:GridControl Name="SampleDataGridControl" ItemsSource="{Binding QuoteCollection}" AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True" AutoGeneratedColumns="SampleDataGridControl_OnAutoGeneratedColumns">
                            <dxg:GridControl.View>
                                <dxg:TableView AllowEditing="False" AutoWidth="True" BestFitArea="All" AllowBestFit="True" ShowGroupPanel="True" ShowSearchPanelMode="Always"/>
                            </dxg:GridControl.View>
                        </dxg:GridControl>
                    </dxdo:LayoutPanel>
1
Matt 5 Фев 2015 в 16:32

3 ответа

Лучший ответ

Попробуйте использовать другой конструктор для класса PropertyMetadata:

public static DependencyProperty QuotesProperty = DependencyProperty.Register("Quotes", 
    typeof(List<Quote>), typeof(SciChartUserControl), 
    new PropertyMetadata(someDefaultvalue, QuotesPropertyChanged));

Может случиться так, что конструктор одного параметра, который принимает объект PropertyChangedCallback, который вы используете, смешивается с конструктором, который принимает один параметр object.

1
Sheridan 5 Фев 2015 в 13:53

Я считаю, что это связано с тем, что вы установили свой DataContext в своем коде позади, я столкнулся с той же проблемой при настройке его в XAML? Кажется, что DependencyProperty привязан к DataContext UserControl. DependencyProperty UserControl имеет значение null, когда UserControl имеет DataContext

<views:SciChartUserControl Name="SciChartUserControl"
                           Quotes="{Binding DataContext.QuoteCollection, RelativeSource={RelativeSource AncestorType={x:Type dxdo:LayoutPanel}}}" />
0
Community 23 Май 2017 в 12:12

Попробуйте это ... в объявлении свойства зависимости измените PropertyMetadata на следующее ..

new PropertyMetadata(null, new PropertyChangedCallback(QuotesPropertyChanged))
0
Bathineni 5 Фев 2015 в 13:52