如何修复“对象引用未设置到对象的实例”。将事件绑定到使用 MVVM

我有一个 ListView,其中 ItemsSource 设置为一种 Movies 集合(带有 Movie 对象)。然后我在里面有一个 DataTemplate,其中包含一个 ComboBox 和一个 TextBlock。在 ComboBox 上,我将 Selected 项目绑定到 Movie 对象包含的(剧集的)进度。这里我使用的是普通的“绑定”方法。但是当我想将方法绑定到“DropDownClosed”事件时,问题就来了。这在使用 Code Behind 时工作正常,但使用 ViewModel 和 x:Bind 时它给我“对象引用未设置到对象的实例”。在构建我的应用程序时。


目标是绑定到 ViewModel 中的方法,而不是没有错误的代码隐藏。


当我取消“DropDownClosed”事件时,一切都很顺利。没有其他事件效果更好。


<ListView ItemsSource="{x:Bind ViewModel.MovieLibrary}">

    <ListView.ItemTemplate>

        <DataTemplate>

            <StackPanel Spacing="20" Orientation="Horizontal">

                <ComboBox SelectedItem="{Binding Progress}"

                                          ItemsSource="{Binding Media.Episodes, Converter={StaticResource NumberToArrayConverter}}"

                                          DropDownClosed="{x:Bind ViewModel.UpdateStuff}">

                </ComboBox>

                <TextBlock Text="{Binding Media.Title}" TextWrapping="Wrap" />

            </StackPanel>

        </DataTemplate>

    </ListView.ItemTemplate>

</ListView>

还有这个,但是如果它是空的,它的效果也一样糟糕,所以如果有必要(从视图模型来看),请 idk :


public void UpdateStuff(object sender, object e)

        {

            //blabla not important

        }

问题是我根本无法对任何属性使用 x:Bind。


ibeautiful
浏览 108回答 2
2回答

蝴蝶刀刀

要在 DataTemplate 中使用 x:Bind,您必须在 DataTemplate 中指定 x:DataType="local:Movie"。模板中 x:Bind 中的路径应与 Movie 对象相关。“未设置对象引用”仅表示您尚未分配指针。也许 ViewModel 为 null 或 ViewModel.UpdateStuff 为 null。

12345678_0001

我现在尝试通过一个小例子向您展示一个解决方案。你会看到有些事情发生了变化。我希望它仍然能满足您的需要:&nbsp; &nbsp; <ListView ItemsSource="{Binding MovieLibrary}">&nbsp; &nbsp; &nbsp; &nbsp; <ListView.ItemTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <DataTemplate>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <StackPanel Orientation="Horizontal">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <ComboBox&nbsp; ItemsSource="{Binding Episodes}"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SelectedItem="{Binding Progress}" >&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </ComboBox>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <TextBlock Text="{Binding Title}" TextWrapping="Wrap" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </StackPanel>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </DataTemplate>&nbsp; &nbsp; &nbsp; &nbsp; </ListView.ItemTemplate>&nbsp; &nbsp; </ListView>这是一个示例视图模型:public class MainWindowModel{&nbsp; &nbsp; public MainWindowModel()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MovieLibrary = new ObservableCollection<Media>();&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; &nbsp; //Exmaple Fill&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; &nbsp; var m1 = new Media() { Title = "Breaking Bad", Episodes = new List<string> { "1", "2", "3", "4", "5", "6" } };&nbsp; &nbsp; &nbsp; &nbsp; var m2 = new Media() { Title = "The Big Bang Theory", Episodes = new List<string> { "1", "2", "3" } };&nbsp; &nbsp; &nbsp; &nbsp; m1.MediaChangedAction += OnMediaChanged;&nbsp; &nbsp; &nbsp; &nbsp; m2.MediaChangedAction += OnMediaChanged;&nbsp; &nbsp; &nbsp; &nbsp; MovieLibrary.Add(m1);&nbsp; &nbsp; &nbsp; &nbsp; MovieLibrary.Add(m2);&nbsp; &nbsp; }&nbsp; &nbsp; public ObservableCollection<Media> MovieLibrary { get; set; }&nbsp; &nbsp; private void OnMediaChanged(Media movie)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // do something&nbsp; &nbsp; }}public class Media{&nbsp; &nbsp; public event Action<Media> MediaChangedAction;&nbsp; &nbsp; public Media()&nbsp; &nbsp; {&nbsp; &nbsp; }&nbsp; &nbsp; public string Title { get; set; }&nbsp; &nbsp; public List<string> Episodes { get; set; }&nbsp; &nbsp; private string _progress;&nbsp; &nbsp; public string Progress&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get { return _progress; }&nbsp; &nbsp; &nbsp; &nbsp; set&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _progress = value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MediaChangedAction?.Invoke(this);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}你看我简化了一点(没有转换器等)。“事件”也被移动到视图模型。对我来说,优点是,它现在不依赖于视图来调用事件,它只是对视图模型很重要。因此,如果您制作不同的视图来显示媒体,它仍然可以正常工作。我也远离了“双向”的东西,因为目前没有必要从视图模型发送到视图。如果需要,“媒体”将需要实施 INotifyPropertyChanged。
打开App,查看更多内容
随时随地看视频慕课网APP