如何解决UWP中DependencyProperty中加载错误的问题



我正在尝试将命令栏与主命令动态绑定。这是XAML:

<CommandBar IsOpen="True"
Background="Transparent"
BorderBrush="Black"
Style="{StaticResource TagsCommandBar}"
DefaultLabelPosition="Right">
<interactivity:Interaction.Behaviors>
<local:BindableCommandBarBehavior PrimaryCommands="{x:Bind ViewModel.AppBarButtonList, Mode=OneWay}" />
</interactivity:Interaction.Behaviors>
</CommandBar>

并且,命令的依赖属性如下:

public class BindableCommandBarBehavior : Behavior<CommandBar>
{
public ObservableCollection<AppBarButton> PrimaryCommands
{
get
{
return (ObservableCollection<AppBarButton>)GetValue(PrimaryCommandsProperty);
}
set
{
SetValue(PrimaryCommandsProperty, value);
}
}
public static DependencyProperty PrimaryCommandsProperty = DependencyProperty.Register(
"PrimaryCommands", typeof(ObservableCollection<AppBarButton>), typeof(BindableCommandBarBehavior), new PropertyMetadata(default(ObservableCollection<AppBarButton>), UpdateCommands));
private static void UpdateCommands(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (!(dependencyObject is BindableCommandBarBehavior behavior))
return;
if (dependencyPropertyChangedEventArgs.OldValue is INotifyCollectionChanged oldList)
{
oldList.CollectionChanged -= behavior.PrimaryCommandsCollectionChanged;
}
if (dependencyPropertyChangedEventArgs.NewValue is INotifyCollectionChanged newList)
{
newList.CollectionChanged += behavior.PrimaryCommandsCollectionChanged;
}
behavior.UpdatePrimaryCommands();
}

private void PrimaryCommandsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
UpdatePrimaryCommands();
}

private void UpdatePrimaryCommands()
{
if (AssociatedObject == null)
return;
if (PrimaryCommands == null)
return;
AssociatedObject.PrimaryCommands.Clear();
if (!(PrimaryCommands is IEnumerable enumerable))
{
AssociatedObject.PrimaryCommands.Clear();
return;
}
if (PrimaryCommands != null)
{
AssociatedObject.PrimaryCommands.Clear();
foreach (var command in PrimaryCommands)
{
if (!AssociatedObject.PrimaryCommands.Contains(command))
{
try
{
AssociatedObject.PrimaryCommands.Add(command);
}
catch (Exception ex)
{
Log.D(this, ex.Message);
}
}   
}
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (PrimaryCommands != null)
{
PrimaryCommands.CollectionChanged -= PrimaryCommandsCollectionChanged;
}
}
}

当我动态添加AppBarButtonList时,此代码运行良好。但是在加载保存的CCD_ 2的过程中出现了问题。显示异常:

Element is already the child of another element.
at System.Runtime.InteropServices.WindowsRuntime.IVector`1.Append(T value)
at BindableCommandBarBehavior.UpdatePrimaryCommands()

我需要善意的帮助来解决这个问题,并加载和添加AppBarButtonList

来回导航可能会导致此错误。在这种情况下,您可以制作PrimaryCommands项目的副本。希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新