下面是项目内部的一些代码:视图模型:
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属性。结果是一样的,列表视图的可见性永远不会更新。
1条答案
按热度按时间xpcnnkqh1#
这里的代码不会导致PropertyChangedEvent被触发,我已经将其更改为调用setter。
你的setter应该是:
总是挑战设置者,以确定是否真的有价值的变化。如果盲目地触发
OnPropertyChanged()
,则会对大型应用程序产生巨大的性能影响通过使用CallerMemberName属性,您可以在从setter调用时省略属性名。