XAML 为什么我的WPF列表视图可见性未更新?

mi7gmzs6  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(131)

下面是项目内部的一些代码:视图模型:

private bool _state;
        public bool State
        {
            get { return _state; }
            set
            {
                _state = value;
                OnPropertyChanged(nameof(State));
            }
        }
...

public SettingsViewModel() {
            SwitchCommand = new DelegateCommand(execute: DetermineState, canExecute => true);
            //SwitchCommand = new DelegateCommand(DetermineState);
        }

        private void DetermineState(object? parameter)
        {
            switch (parameter?.ToString())
            {
                case "foo":
                     _state = true;
                   break;
            }
         }

列表视图XAML:

<ListView
                Grid.Row="1"
                Grid.ColumnSpan="3" 
                Visibility="{Binding State, Converter={StaticResource BoolToVisibilityConverter},UpdateSourceTrigger=PropertyChanged, FallbackValue=Collapsed}"
                ItemsSource="{Binding Stuff}"
                x:Name="ExampleList">

BoolToVisibility转换器

public class BoolToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool && (bool)value) return Visibility.Visible;
            return Visibility.Collapsed;

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Visibility && (Visibility)value == Visibility.Visible) return true;
            return false;
        }

这个命令是用一个带有命令参数“foo”的按钮调用的,这个按钮被调用,状态被更新为true,工作正常。然而,当我把断点放在我的BoolToVisbilityConverter类中时,它永远不会被调用。Datacontext和viewmodel在代码隐藏中被示例化和正确设置。

private SettingsViewModel _viewModel;
public Settings()
        {
            _viewModel = new SettingsViewModel();
            DataContext = _viewModel;
            InitializeComponent();
        }

当按钮被按下时,什么也没有发生,state被转换为true,但是listview本身保持在折叠状态。
我已经尝试删除UpdateSourceTrigger,使用Mode=TwoWay,将类型更改为Visibility类型,不使用转换器,而是在命令中设置.Visibility属性。结果是一样的,列表视图的可见性永远不会更新。

xpcnnkqh

xpcnnkqh1#

这里的代码不会导致PropertyChangedEvent被触发,我已经将其更改为调用setter。

private void DetermineState(object? parameter)
{
    switch (parameter?.ToString())
    {
        case "foo":
            State = true;
            break;
    }
}

你的setter应该是:

public bool State
{
    get { return _state; }
    set
    {
        if (_state != value)
        {
            _state = value;
            OnPropertyChanged();
        }
    }
}

总是挑战设置者,以确定是否真的有价值的变化。如果盲目地触发OnPropertyChanged(),则会对大型应用程序产生巨大的性能影响
通过使用CallerMemberName属性,您可以在从setter调用时省略属性名。

using System.Runtime.CompilerServices;
...

protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

相关问题