XAML SelectionChanged替代方案在Avalonia

dhxwm5r4  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(188)

Avalonia中的SelectionChanged很不幸地被破坏了,并且多年没有修复。例如:

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {             
            var vm = (MainWindowViewModel)DataContext;              
            Debug.WriteLine($"{vm.SelectedValue}");
        }

这将打印先前选择的值,而不是此时,因为OnSelectionChanged在选择更改之前触发,而不是在更改期间或之后触发。这实际上意味着它没有任何作用,因为如果你想在某个值更改时更改应用程序的状态,你不能这样做,因为它不知道当前值。
是否有可能以某种方式覆盖它或实现您自己的实际有效的解决方案?

w8f9ii69

w8f9ii691#

正如评论中提到的,在视图模型中处理逻辑比在代码隐藏中处理逻辑更好,但是要回答如何用另一种方式实现它的问题,您可以在视图模型中创建并引发一个事件:

// ViewModel

public delegate void SelectedValueChangedEvent();
public SelectedValueChangedEvent? SelectedValueChanged;

// ...
// call it when the "SelectedValue" has already changed
SelectedValueChanged?.Invoke();
// if using reactiveui you can do it this way:
// this.WhenAnyValue(x => x.SelectedValue).Subscribe(x => SelectedValueChanged?.Invoke());

然后,在视图中,您必须订阅此事件,但仅当DataContext已设置时:

// View

public MainWindow()
{
    // ...
    PropertyChanged += (s, e) =>
    {
        if (e.Property.Name == "DataContext" && DataContext is MainWindowViewModel vm)
        {
            vm.SelectedValueChanged += () => Debug.WriteLine(vm.SelectedValue);
        }
    }; 
}

如果愿意,还可以将参数放入SelectedValueChangedEvent委托。

相关问题