无法在Avalonia UI中触发附加属性



我试图公开我使用Avalonia UI创建的自定义控件的属性。我的计划是允许该属性通过xaml绑定到外部控件的ViewModel。但我似乎无法让Changed事件处理程序触发。我已经模仿了Avalonia的文档,但我仍然不能让它工作。

这是我的自定义控件:

public static readonly AttachedProperty<SessionTableEntry> SessionProperty =
AvaloniaProperty.RegisterAttached<CommandHistoryControl, SessionTableEntry>("Session",
typeof(CommandHistoryControl),
null,
false,
BindingMode.TwoWay);
public static SessionTableEntry GetSession(AvaloniaObject o) {
return o.GetValue(SessionProperty);
}
public static void SetSession(AvaloniaObject o, object param) {
o.SetValue(SessionProperty, param);
}

这是一个xaml绑定,它应该使用"Session"将CommandHistoryControl的属性设置为"session"。属性。

<ctrls:CommandHistoryControl
Grid.Column="2"
Name="History"
Session="{Binding Session}"></ctrls:CommandHistoryControl>

然后我在ViewModel中为父控件设置Session属性,什么也没有发生。

InteractiveSessionWindow window = new InteractiveSessionWindow() {
DataContext = new InteractiveSessionViewModel()
};
window.ViewModel.Session = session;
编辑:我发现了更多的信息。AttachedProperty的getter和setter正确地触发,但只有当DataContext为空时才会触发。一旦我将DataContext设置为某些内容,attachdproperties就会停止工作。这是预期行为吗?

看来,你不能设置一个DataContext ViewModel对象,也得到一个处理attachdproperty的变化。为了解决这个问题,我使用相同的ViewModel对象,但将其分配给控件而不使用DataContext。

public MyViewModel ViewModel { get; set; }

然后将绑定到$parent[x]。

<Label Content="{Binding $parent[2].ViewModel.SessionId}"/>

我不太喜欢这个解决方案,因为每次我的xaml更改时,我都必须更新所有绑定的索引…但是已经5个月了,我还没有想出一个更好的方法。

最新更新