初始化后WPF绑定不适用于目标
我正在尝试添加Series绑定到Visifire图形控件集。 为此我已经创造了时间的SeriesSource依赖属性DataSeriesCollection
。 这是绑定在前端使用:
`<Chart SeriesSource={Binding Series} />`
问题
当源更改时,将调用验证回调。 传递给它的值是正确的值,填充的ObservableCollection<something>
。 在调用validate值后立即调用CoerceValue回调,并且发送给它的值为EMPTY ObservableCollection<something>
。 赏金将发给任何能够:
ObservableCollection<someting>
传递给CoerceValue回调函数OR 以下是视图的数据模板:
<DataTemplate DataType="{x:Type vm:ReportViewModel}">
<Grid Name="rootGrid">
<visifire:Chart Grid.Row="1" SeriesSource="{Binding Series}">
<visifire:Chart.AxesX>
<visifire:Axis Title="X axis" />
</visifire:Chart.AxesX>
<visifire:Chart.AxesY>
<visifire:Axis Title="Y axis" />
</visifire:Chart.AxesY>
</visifire:Chart>
</Grid>
</DataTemplate>
这是目标依赖属性
//Getter and setter for Dependency Property
public ObservableCollection<DataSeries> SeriesSource
{
get { return (ObservableCollection<DataSeries>)GetValue(SeriesSourceProperty); }
set { SetValue(SeriesSourceProperty, value); }
}
// Using a DependencyProperty as the backing store for SeriesSource. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SeriesSourceProperty =
DependencyProperty.Register("SeriesSource", typeof(ObservableCollection<DataSeries>), typeof(Chart), new UIPropertyMetadata(new ObservableCollection<DataSeries>(), new PropertyChangedCallback(OnSeriesSourceChange), new CoerceValueCallback(CoerceSeries)), new ValidateValueCallback(ValidateSeriesSource));
//Value validation callback
private static bool ValidateSeriesSource(object value)
{
if (value as ObservableCollection<DataSeries> != null)
return true;
return false;
}
//Dependency Property Changed callback
private static void OnSeriesSourceChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Chart c = d as Chart;
if (c == null)
return;
//This line was causing the issue. It was overriding the setter
c.SeriesSource = (DataSeriesCollection)e.NewValue;
}
//Coerce Value callback
private static object CoerceSeries(DependencyObject d, object value)
{
Chart c = d as Chart;
var collection = value as System.Collections.ObjectModel.ObservableCollection<Visifire.Charts.DataSeries>;
foreach (var item in c.Series)
{
if (!collection.Contains(item))
c.Series.Remove(item);
}
foreach (var item in collection)
{
if (!c.Series.Contains(item))
c.Series.Add(item);
}
return collection;
}
新的信息
由CoerceValue回调接收的值始终是该属性设置的第一个值。 因此,如果我传递的第一个值是包含1个项目的列表,它总是会将值强制回到包含一个项目的列表中!
编辑:发现问题,它是在属性更改回调。 值得一提的是马特帮助我用CoerceValue回调
这可能不是确切的问题,但你在制定者中有逻辑。 当通过绑定分配属性时,该代码不会执行。
不要将逻辑添加到setter,而应考虑使用“强制”回调,每次将值分配给属性时都会调用该回调。 有关“胁迫值”回调的更多详细信息,请参阅此处。 它们与您为“属性更改”回调所做的操作非常相似。
链接地址: http://www.djcxy.com/p/67567.html上一篇: WPF binding not applying to target after initialization