Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将ListView.SelectedItem属性绑定到MVVM中的ViewModel?_C#_Xaml_Mvvm_Uwp - Fatal编程技术网

C# 如何将ListView.SelectedItem属性绑定到MVVM中的ViewModel?

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,

我目前正在从事一个UWP MVVM项目,该项目要求最终用户从列表中选择一个项目,然后单击一个按钮。按钮及其链接到的命令使用SelectedItem属性检测最终用户要编辑或删除的对象。我在Fody中使用MVVM模式(因此INotificationPropertyChanged已经实现)。问题在于,所有按钮或其功能都无法工作,因为属性始终返回“null”

以下是XAML视图:

<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
    }
}