按钮状态 (enabled/disabled) 取决于 SelectedItem 属性

Button state (enabled/disabled) depending on SelectedItem property

当用户 select Listview 中的一行绑定到元素的 ObservableCollection 时,按钮的状态(在 listview 之外)应该根据 SelectedItem 属性。

它适用于使用转换器 进行选择更改,但如果用户保留该行 selected 并且如果项目 属性 已更改,则它不会更改按钮状态

这是按钮和列表xaml

<Button x:Name="btPause"  
        IsEnabled="{Binding Path=SelectedItem, ElementName=LstFiles,  Converter={StaticResource StateToBoolConverter }}"
        Width="121" Margin="0,10,0,10"
        Content="Pause"/>
<ListView  SelectionMode="Single" x:Name="LstFiles"  ItemsSource="{Binding LocalFiles}" Height="273.4" UseLayoutRounding="False" Margin="10">
    <ListView.View>
        <GridView  >
            <GridViewColumn Header="DisplayName" DisplayMemberBinding="{Binding DisplayName}"  Width="200"/>
            <GridViewColumn Header="FileState" DisplayMemberBinding="{Binding FileState}"  Width="100"/>
        </GridView>
    </ListView.View>
</ListView>

我用了转换器:

if (!(value is FileInfo l_fileInfo)) return false;
bool ret = (l_fileInfo.FileState == FileState.Uploading ? true : false);
return ret;

虚拟机:

class FilesInfoViewModel:INotifyPropertyChanged
{
    private ObservableCollection<FileInfo> _localFiles;
    public ObservableCollection<FileInfo> LocalFiles
    {
        get { return _localFiles; }
        set { _localFiles = value; OnPropertyChanged("LocalFiles"); }
    }

    public FilesInfoViewModel()
    {
        _localFiles = new ObservableCollection<FileInfo>
        {
            new FileInfo { DisplayName = "Test", FileState = FileState.Uploading }
        };
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

型号类

public class FileInfo : INotifyPropertyChanged
{

    private FileState _fileState;
    public FileState FileState
    {
        get { return _fileState; }
        set { _fileState = value; OnPropertyChanged("FileState"); }
    }

    private string _displayName;
    public string DisplayName
    {
        get { return _displayName; }
        set { _displayName = value; OnPropertyChanged("DisplayName"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public enum FileState
{
    Uploading,
    Downloading,
    Connecting,
    Error,
    Waiting,
    Finishing,
    Paused
}

希望够清楚

直接绑定到状态:

IsEnabled="{Binding Path=SelectedItem.FileState, ElementName=LstFiles,  Converter={StaticResource StateToBoolConverter}}"

转换器应作相应修改:

return (value is FileState fileState) && (fileState == FileState.Uploading);