Wpf 当绑定为StaticResource时,如何获取INotifyPropertyChanged

Wpf 当绑定为StaticResource时,如何获取INotifyPropertyChanged,wpf,binding,Wpf,Binding,我正在做一些绑定,并使用第三方控件 我遇到的问题是(或者说我工作过(因此认为))控件不是可视化树的一部分。因此,我无法以正常方式直接绑定到DataContext。相反,我必须做以下几点 <StackPanel.Resources> <loc:BackupResultsViewModel x:Key="MyVm" /> <CollectionViewSource x:Key="StatusCollect

我正在做一些绑定,并使用第三方控件

我遇到的问题是(或者说我工作过(因此认为))控件不是可视化树的一部分。因此,我无法以正常方式直接绑定到DataContext。相反,我必须做以下几点

 <StackPanel.Resources>
                <loc:BackupResultsViewModel x:Key="MyVm" />
                <CollectionViewSource x:Key="StatusCollection" Source="{Binding Source={StaticResource MyVm}, Path=PassFailStatus}" />
            </StackPanel.Resources>


                    <xctk:Chart Height="300" Width="300" ShowLegend="True" >
                        <xctk:Chart.Areas>
                                <xctk:Area.Series>
                                    <xctk:Series Title="Overall status" DataPointsSource="{Binding Source={StaticResource StatusCollection}}">
                                        <xctk:Series.Layout>
                                            <xctk:PieLayout />
                                        </xctk:Series.Layout>
                                        <xctk:Series.DataPointBindings>
                                            <xctk:BindingInfo PropertyName="Y">
                                                <xctk:BindingInfo.Binding>
                                                    <Binding Path="Y"/>
                                                </xctk:BindingInfo.Binding>
                                            </xctk:BindingInfo>
                                            <xctk:BindingInfo PropertyName="Label">
                                                <xctk:BindingInfo.Binding>
                                                    <Binding Path="Label"/>
                                                </xctk:BindingInfo.Binding>
                                            </xctk:BindingInfo>
                                        </xctk:Series.DataPointBindings>


                                    </xctk:Series>
                                </xctk:Area.Series>
                            </xctk:Area>
                        </xctk:Chart.Areas>
                    </xctk:Chart>

        </StackPanel>
和控制

    private void ShowComplete(int backupComplete, int backupFailed, int backupSkipped)
    {
        //this.PassFailStatus initialized in constructor and in this method, same result
        App.Current.Dispatcher.Invoke((Action) (() =>
            {
                try
                {
                    this.PassFailStatus.Add(new DataPoint(-99, backupComplete, "Copied"));
                    this.PassFailStatus.Add(new DataPoint(-99, backupFailed, "Failed"));
                    this.PassFailStatus.Add(new DataPoint(-99, backupSkipped, "Skipped"));
                }
                catch (Exception ex)
                {
                    string s = ex.ToString();//for debugging
                }

            }));
    }

没有抛出异常,如果我在我的属性中放置了一个表,我可以看到setter被设置了,但是之后,getter永远不会被调用。我不知道该做什么了

问题在于使用ObservableCollections并添加到它们中。尝试使用new初始化oc,它应该可以工作。当然,您需要以其他方式处理向集合中添加元素的问题。

在ObservableCollection上引发一个关于PropertyChanged的是不够的,您需要在ObservableCollection中的元素中引发它

例如:

您的型号:

public class Foo
{
    public int Bar { get; set; }
}
用于:

private ObservableCollection<Foo> somthing;
public ObservableCollection<Foo> Something
{
    get { return something; }
    set
    {
        if (something == value)
            return;

        something = value;
        OnPropertyChanged("Something");

    }
}

现在,您的ObservableCollection应该了解其内部的更改,并更新您的视图。

如注释部分所述,问题不在代码中,而是OxyPlot,它在基础模型更改时不会更新点。为此,您需要调用
Refresh
InvalidatePlot
。请参阅提供的详细信息


另外,如果您想以MVVM的方式进行此操作,我建议您为oxyPlot创建一个附加的行为来手动刷新它。

在文章的最后一个代码段中,我解释了我在构造函数中使用new初始化OC,但使用Add无法做到这一点。它不会更新你的用户界面。我仍然迷路。我要添加到一个可观察的集合中,而不是列表中。我在页面上有其他属性,使用ObservableCollection,我只是添加了它们,它们会随着添加而更新……最有可能的问题是oxyPlot,当绑定模型更改时,它不会刷新。您必须手动刷新它。请查看详细信息。@RohitVats,虽然我确信这是正确的,但在使用MVVM时如何做到这一点?我没有直接引用它,而且据我所知,在使用MVVM时,我不能按名称引用它。我想我唯一的其他选择是将其设置为用户控件,当我需要它时,创建它,通过构造函数传递数据如何创建附加行为以刷新模型更改时的oxyPlot?@RohitVats对,是的。在这种情况下,如果确实需要以这种方式刷新,我当前的方法将无法工作。我对此很满意,因为至少它看起来好像不是我的代码!:)附加行为是否与从属属性相同?是的,它们被称为。参考样品,并进行测试。
public class Foo
{
    public int Bar { get; set; }
}
private ObservableCollection<Foo> somthing;
public ObservableCollection<Foo> Something
{
    get { return something; }
    set
    {
        if (something == value)
            return;

        something = value;
        OnPropertyChanged("Something");

    }
}
public class Foo
{
    private int bar;
    public int Bar
    {
        get { return bar; }
        set
        {
            if(bar == value)
                return;
            bar = value;
            OnPropertyChanged("Bar");
        }
    }
}