背景簡介
軟件功能為,讀取一個文件夾下的所有子文件夾,每個文件夾對自動對應生成 一組 “按鍵+四個勾選”
按鍵點擊觸發,可以發送與其對應文件夾中的一些內容。這個綁定的過程我在之前的文章有過詳細的介紹,非常的簡單。
這里回顧一下,貼一段代碼:
<Grid><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><DockPanel><Label DockPanel.Dock="Right" Content="{Binding BtnName}"/><Button DockPanel.Dock="Right" Command="{Binding NextCmd}">下一個</Button><Button DockPanel.Dock="Right" Command="{Binding FliesReloadCmd}">文件重載</Button><hc:TextBox Text="{Binding saveInfo.BaseDirectoryPath}"hc:TitleElement.Title="路徑:" hc:TitleElement.TitlePlacement="Left"hc:TitleElement.HorizontalAlignment="Center"hc:TitleElement.TitleWidth="50"/></DockPanel><ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" ><ItemsControl ItemsSource="{Binding ButtonList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Grid Margin="5"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Content="{Binding Name}" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.TestCmd}"CommandParameter="{Binding Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/><StackPanel Grid.Column="1" VerticalAlignment="Center"><CheckBox IsChecked="{Binding Bottom}"/><CheckBox IsChecked="{Binding Middle}"/><UniformGrid Columns="2"><CheckBox IsChecked="{Binding Head}"/><CheckBox IsChecked="{Binding Ptb}"/></UniformGrid></StackPanel></Grid></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ScrollViewer></Grid>
明悟
現在,我需要一個新的功能,因為一個個的按照順序點按鈕實在是太低效了。我增加了一個下一個
按鈕。 我的目的是,通過下一個按鈕來代替,“一個個的按照順序點按鈕” 這個操作!
迷霧
現在換成你,你能給出一個思路嗎? 我馬上就有了思路: 那,只要我在
下一個
按鈕對應的事件中,獲取到所有對象的實例,然后再觸發按鍵按下不久行了?
于是我立刻查看了后臺代碼!
public ObservableCollection<BtnItem> ButtonList { get; set; } = new ObservableCollection<BtnItem>();
由于我們使用的是綁定,使用后臺的數組,其實是按鍵對應的數據,而不是按鍵本身。
要想得到按鍵的實例,似乎沒有很直接的方式。結果我就在,如何通過數據源獲取界面對象實例
這個問題上陷入沉思!
明悟
突然,一個念頭突然打破的循環,既然是綁定,為啥我還需要界面的那些按鍵對象?是因為要那一個個觸發按鍵嗎?但是觸發按鍵是表現,實際的目的是實現:按鍵觸發,可以發送與其對應文件夾中的一些內容
于是,注意力就從按鍵的點擊,到了功能的實現!現在回到最初的訴求!
增加了一個
下一個
按鈕。 我的目的是,通過下一個按鈕來代替,“一個個的按照順序點按鈕” 這個操作!
再之前的代碼里,我已經實現了最初的功能(按鍵觸發,可以發送與其對應文件夾中的一些內容),現在只是增加了一個下一個
按鈕來代替。
之前的代碼:
void Test(BtnItem btnItem)
{try{//發送功能,省略}catch (Exception ex){MessageBox.Show(ex.Message);}
}
BtnItem 就是按鍵綁定數組的子項。也只是個數據。Test通過接收這個數據,得知是哪個按鍵按下。
所以下一個按鍵對應的事件,直接調用Test,并傳入對應的BtnItem就好了!這樣就是和界面點擊按鍵一樣了!
//下一張
NextCmd = new DelegateCommand(() =>
{ //MessageBox.Show(ButtonList[btnIndex].Name);if (btnIndex < ButtonList.Count - 1){Test(ButtonList[btnIndex]);btnIndex++;}else{MessageBox.Show("完畢了!"); }
});
所以,這里是需要利用ButtonList,并記錄下btnIndex。就能實現輪詢按按鈕的功能。
小結
輪詢按按鈕這個動作,讓我的思維產生的偏差,讓我一直想如何獲取界面的按鍵對象!
但是,我們完成的綁定之后,就一定要注意通過數據驅動界面,能夠直接用數據解決的問題,就不要去想著獲取界面對象。