C# 如何将ListView.SelectedItem属性绑定到MVVM中的ViewModel?
我目前正在从事一个UWP MVVM项目,该项目要求最终用户从列表中选择一个项目,然后单击一个按钮。按钮及其链接到的命令使用SelectedItem属性检测最终用户要编辑或删除的对象。我在Fody中使用MVVM模式(因此INotificationPropertyChanged已经实现)。问题在于,所有按钮或其功能都无法工作,因为属性始终返回“null” 以下是XAML视图:C# 如何将ListView.SelectedItem属性绑定到MVVM中的ViewModel?,c#,xaml,mvvm,uwp,C#,Xaml,Mvvm,Uwp,我目前正在从事一个UWP MVVM项目,该项目要求最终用户从列表中选择一个项目,然后单击一个按钮。按钮及其链接到的命令使用SelectedItem属性检测最终用户要编辑或删除的对象。我在Fody中使用MVVM模式(因此INotificationPropertyChanged已经实现)。问题在于,所有按钮或其功能都无法工作,因为属性始终返回“null” 以下是XAML视图: <ListView ItemsSource = "{x:Bind ViewModel.EmployeeListing,
<ListView ItemsSource = "{x:Bind ViewModel.EmployeeListing, Mode=OneWay}" SelectedItem="{x:Bind ViewModel.SelectedEmployee, Mode=TwoWay, Converter={StaticResource ObjectToEmployeeConverter}}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Employee">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "auto" />
</ Grid.ColumnDefinitions >
< TextBlock Grid.Column="0" Style="{StaticResource BodyTextBlockStyle}" Text="{x:Bind DisplayName, Mode=OneWay}">
</TextBlock>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Footer>
<StackPanel Orientation = "Horizontal" >
< Button Margin="8" x:Uid="Employees_Edit" Command="{x:Bind ViewModel.EditEmployeeCommand}" IsEnabled="{x:Bind ViewModel.IsEmployeeSelected}"/>
<Button Margin = "8" x:Uid="Employees_Remove" Command="{x:Bind ViewModel.RemoveEmployeeCommand}" IsEnabled="{x:Bind ViewModel.IsEmployeeSelected}"/>
<Button Margin = "8" x:Uid="Employees_Add" Command="{x:Bind ViewModel.NewEmployeeCommand}"/>
</StackPanel>
</ListView.Footer>
</ListView>
我非常感谢在这方面的任何帮助。我被卡住了一段时间为什么您要在该绑定上使用
IValueConverter
?您可以使用单向绑定并订阅SelectionChanged事件吗?此外,如果不在这方面投入更多精力,我无法判断ObjectToEmployeeConverter中的类型值。如果它不是类型兼容的强制转换为Employee,则会导致返回值为null。@ClayVerValen,这将违反MVVM@BradleyUffner无论出于何种原因,双向x:Bind都不会编译,因为它必须将对象转换为Employee,反之亦然。我知道继承应该使它工作,但它不是。现在读起来太多了,我怀疑转换器不知何故与此有关。简化你的任务。下面是如何正确地将其与你正在做的事情进行比较,并停止做任何不在链接中的事情。
[AddINotifyPropertyChangedInterface]
public class EmployeesViewModel
{
public ObservableCollection<Employee> EmployeeListing { get; set; }
public Employee SelectedEmployee { get; set; } //NOT currently responding to change in selected item
public bool IsNewEmployee; //True if creating a chart of account. False is editing one.
public Employee NewEmployeeBuffer; //Used when creating a new accont (Discarded if Cancel, Added if Save)
public bool IsEmployeeSelected
{
get
{
return SelectedEmployee != null;
}
}
public ICommand EditEmployeeCommand;
public ICommand RemoveEmployeeCommand;
public ICommand NewEmployeeCommand;
public ICommand SaveEditedEmployeeCommand;
public ICommand CancelCommand;
public EmployeesViewModel()
{
Task.Run(SetEmployeeListing).Wait();
}
private async Task SetEmployeeListing()
{
EmployeeListing = await Employee.EmployeeListing();
}
}
public class ObjectToEmployeeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return value as Employee; //No data
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return value as object; //Data loss
}
}