按钮状态 (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);
当用户 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);