我正在嘗試使用兩個按鈕(每個方向一個)和 MvvM 模式以編程方式滾動串列視圖的內容。
到目前為止,我能找到的所有其他解決方案都利用了x:Name
后面的代碼來訪問串列視圖和呼叫ScrollIntoView(Object)
函式。我以為我可以使用VisualTreeHelper和FindChildren<T>
,但這也需要x:Name
找到并回傳 listview 物件以供我的 ViewModel 使用。
xml:
<!-- ListView to scroll through: -->
<ListView
SelectionMode="None"
ItemsSource="{Binding ListOfListItems}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="UcViewModel:ListItemViewModel">
<Uc:ListItemUserControl/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<!-- One of my two buttons: -->
<Button
Content="Scroll up"
Command="{Binding ScrollUp}"/>
視圖模型:
private DelegateCommand _scrollUp;
public ICommand ScrollUp => _scrollUp ??= new DelegateCommand(PerformScrollUp);
private void PerformScrollUp(object commandParameter)
{
//Here i want to call ListView.BringIntoView(NextItem)
}
我正在使用的 MVVM 庫是:Microsoft.Toolkit.Mvvm
我也嘗試過閱讀檔案,但據我了解,我需要找到一種方法來訪問我的 ViewModel 中的 ListView 物件,但我無法弄清楚我將如何實作這一點。我對 WinUI 3 和 C# 都有些陌生,所以如果有任何缺失的資訊,請說出來,我會盡力提供所需的。
編輯:由于我對所有頁面和 ViewModels 使用 DI,我相信不可能使用 x:Name 簡單地將 listview 注入后面代碼中的 ViewModels 建構式。也就是說,我希望盡可能保持代碼隱藏不變,以遵循 MVVM 模式。
uj5u.com熱心網友回復:
在將我的問題拋在腦后并以新的眼光看待它之后,我找到了以下解決方案。但是我不知道它的效率,和/或它是否是糟糕的編碼原則。
我所做的是通過“CommandParameter”將控制元件傳遞給視圖模型,并將其與 x:Bind 系結到所需的控制元件名稱。這種技術使用系結到代碼隱藏,但是它本身的代碼隱藏保持不變。
在 xaml 中:
<ScrollViewer
x:Name = "TargetScrollViewer">
<ListView>
//Disables listviews internal scrollviewer
//Impliment rest of ListView code
</ListView>
</ScrollViewer>
<Button
Command = "{Binding ScrollUp}"
CommandParameter = "{x:Bind TargetScrollViewer}"/>
<Button
Command = "{Binding ScrollDown}"
CommandParameter = "{x:Bind TargetScrollViewer}"/>
許多人似乎建議使用串列視圖“ScrollIntoView”,如果是這種情況,只需決議串列視圖而不是滾動查看器作為命令引數。
在視圖模型內部:
private DelegateCommand _scrollDown;
public ICommand ScrollDown => _scrollDown ??= new DelegateCommand(PerformScrollDown);
private void PerformScrollDown(object commandParameter)
{
var scrollcontrol = commandParameter as ScrollViewer;
scrollcontrol.ScrollToVerticalOffset(scrollcontrol.VerticalOffset 72);
}
在函式內部,我只是將命令引數轉換回 Scrollviewer,然后呼叫所需的函式。
在我的例子中,我使用 DelegateCommand 的“Syncfusion”將按鈕系結到視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508540.html