在我的主頁上,我有一個包含一些屬性的 MainViewModel,其中一個是 EffectsCtrl(另一個視圖模型,EffectsControl 類的實體),它包含一些與管理效果串列相關的邏輯。要顯示此串列,我的主頁上有以下 ListView:
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Effects"
x:Class="Effects.MainPage"
xmlns:vm="clr-namespace:Effects.ViewModel"
x:DataType="vm:MainViewModel">
...
<ListView
ItemsSource="{Binding EffectsCtrl.Effects}"
HasUnevenRows="True"
VerticalOptions="FillAndExpand">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>
</ContentPage>
以上作業正常 - 串列正確顯示和更新更改。
但在某些時候我把它改成了這個
<ListView
BindingContext={Binding EffectsCtrl}
ItemsSource="{Binding Effects}"
HasUnevenRows="True"
VerticalOptions="FillAndExpand">
...
</ListView>
令我驚訝的是,我的 IDE(Visual Studio)向我顯示了一個提示,即在資料背景關系 MainViewModel 中找不到效果“成員”,并且在啟動構建時失敗并出現錯誤“系結:在“效果”上找不到屬性“效果”。 ViewModel.MainViewModel"'。在這一點上,我有點困惑和好奇,所以我嘗試了其他一些組合,比如
<ListView
BindingContext={Binding EffectsCtrl}
ItemsSource="{Binding EffectsCtrl.Effects}"
HasUnevenRows="True"
VerticalOptions="FillAndExpand">
...
</ListView>
這可以正常編譯,沒有來自 IDE 的警告或構建錯誤,但串列根本不顯示 - 我認為是由于系結錯誤,因為我在除錯器中檢查了 EffectsCtrl,一切都很好,元素像往常一樣添加到串列中。除錯器也沒有顯示警告或錯誤。
這讓我想到了我的問題:這是一個錯誤還是我對系結有誤解?當我進行第一次更改時,我假設當我更改 ListView 的 BindingContext 時,它會影響其 ItemsSource 欄位上的系結。而且我更加困惑,因為第三種情況似乎在一定程度上證實了我的假設。那么有人可以確認這是一個錯誤或向我解釋為什么第二種情況無效嗎?
編輯:我做了一些更多的測驗,當x:DataType="vm:MainViewModel"從 ContentPage 宣告中洗掉時,第二種情況按預期作業。這是為什么?
uj5u.com熱心網友回復:
請參閱資料系結基礎/視圖到視圖系結。用于x:Reference元素的x:Name.
如果您的 EffectsCtrl 具有 x:Name myEffectsCtrl,則執行以下操作:
<EffectsCtrl x:Name="myEffectsCtrl" ... />
<ListView
BindingContext="{x:Reference myEffectsCtrl}" ... />
uj5u.com熱心網友回復:
我自己在Compiled bindings檔案中找到了答案。事實證明x:DataType="vm:MainViewModel"是問題所在,盡管這種行為是絕對正確的,問題是由于我的誤解。此屬性集會ContentPage導致系結的編譯。正如上述檔案所述
將 VisualElement 上的 x:DataType 屬性設定為 VisualElement 及其子項將系結到的物件的型別。
這意味著ContentPage預期中的每個元素都BindingContext設定為 MainViewModel 的一個實體(除非另一個x:DataType屬性另有說明,我假設)。因此,當Effects在第二種情況下使用系結時,即使BindingContext設定為 EffectsCtrl,編譯器也會拋出錯誤 - 它假定BindingContext將是 MainViewModel 的實體(而不是 EffectsControl 實體)并且它確實不包含該Effects屬性。
我為此提供了兩種可能的解決方案:
第一種解決方案:
x:DataType="vm:MainViewModel"只需通過從ContentPage屬性中洗掉來切換到運行時驗證。但是這樣的操作會產生一些負面后果 - 您會丟失編譯時系結驗證,運行時驗證會影響性能,并且 IDE 不會提供自動完成功能(至少是 Visual Studio)。然后代碼如下所示:
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Effects"
x:Class="Effects.MainPage"
xmlns:vm="clr-namespace:Effects.ViewModel">
...
<ListView
BindingContext="{Binding EffectsCtrl}"
ItemsSource="{Binding Effects}"
HasUnevenRows="True"
VerticalOptions="FillAndExpand">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>
</ContentPage>
MainViewModel 通過依賴注入傳遞,一切正常。
第二種解決方案:
為了保留已編譯的系結,我只是將x:DataType="vm:EffectsControl"屬性添加到了,ListView但后來我無法使用該BindingContext="{Binding EffectsCtrl}"屬性,因為 EffectsCtrl 本身沒有 EffectsCtrl 屬性。因此,我沒有將其包裝ListView在一個像這樣的新ContentView類中:
<ContentView
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Effects.EffectsListView"
xmlns:vm="clr-namespace:Effects.ViewModel"
x:DataType="vm:EffectsControl">
<ListView
ItemsSource="{Binding Effects}"
HasUnevenRows="True"
VerticalOptions="FillAndExpand">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>
</ContentView>
并將主頁上的串列替換為新類
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Effects"
x:Class="Effects.MainPage"
xmlns:vm="clr-namespace:Effects.ViewModel"
x:DataType="vm:MainViewModel">
...
<local:EffectsListView BindingContext="{Binding EffectsCtrl}"/>
</ContentPage>
我發現這種行為不是很直觀,但現在我理解了這個概念,我認為這個問題有點傻。無論如何,我希望這可以幫助像我這樣迷失的初學者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516449.html
標籤:列表显示数据绑定毛伊岛
上一篇:將自定義物件插入自定義物件串列
下一篇:KotlinAndroidNavigationtoFragment在setOnItemClickListener中不起作用
