亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復“對象引用未設置到對象的實例”。將事件綁定到使用 MVVM

如何修復“對象引用未設置到對象的實例”。將事件綁定到使用 MVVM

C#
ibeautiful 2022-11-22 15:43:35
我有一個 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。
查看完整描述

2 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

要在 DataTemplate 中使用 x:Bind,您必須在 DataTemplate 中指定 x:DataType="local:Movie"。模板中 x:Bind 中的路徑應與 Movie 對象相關。

“未設置對象引用”僅表示您尚未分配指針。也許 ViewModel 為 null 或 ViewModel.UpdateStuff 為 null。


查看完整回答
反對 回復 2022-11-22
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

我現在嘗試通過一個小例子向您展示一個解決方案。你會看到有些事情發生了變化。我希望它仍然能滿足您的需要:


    <ListView ItemsSource="{Binding MovieLibrary}">

        <ListView.ItemTemplate>

            <DataTemplate>

                <StackPanel Orientation="Horizontal">

                    <ComboBox  ItemsSource="{Binding Episodes}" 

                               SelectedItem="{Binding Progress}" >

                    </ComboBox>

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

                </StackPanel>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>

這是一個示例視圖模型:


public class MainWindowModel

{

    public MainWindowModel()

    {

        MovieLibrary = new ObservableCollection<Media>();


        //

        //Exmaple Fill

        //

        var m1 = new Media() { Title = "Breaking Bad", Episodes = new List<string> { "1", "2", "3", "4", "5", "6" } };

        var m2 = new Media() { Title = "The Big Bang Theory", Episodes = new List<string> { "1", "2", "3" } };

        m1.MediaChangedAction += OnMediaChanged;

        m2.MediaChangedAction += OnMediaChanged;

        MovieLibrary.Add(m1);

        MovieLibrary.Add(m2);

    }

    public ObservableCollection<Media> MovieLibrary { get; set; }


    private void OnMediaChanged(Media movie)

    {

        // do something

    }


}


public class Media

{

    public event Action<Media> MediaChangedAction;


    public Media()

    {

    }


    public string Title { get; set; }

    public List<string> Episodes { get; set; }



    private string _progress;

    public string Progress

    {

        get { return _progress; }

        set

        {

            _progress = value;

            MediaChangedAction?.Invoke(this);

        }

    }

}

你看我簡化了一點(沒有轉換器等)?!笆录币脖灰苿拥揭晥D模型。對我來說,優點是,它現在不依賴于視圖來調用事件,它只是對視圖模型很重要。因此,如果您制作不同的視圖來顯示媒體,它仍然可以正常工作。


我也遠離了“雙向”的東西,因為目前沒有必要從視圖模型發送到視圖。如果需要,“媒體”將需要實施 INotifyPropertyChanged。


查看完整回答
反對 回復 2022-11-22
  • 2 回答
  • 0 關注
  • 189 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號