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