在WPF中,我有一個ListView的2列,第一列需要是一個按鈕。糾正我,如果我錯了,但我發現在ListView中實現按鈕的唯一方法是使用DataTemplate。我發現這個問題是我沒有辦法維護我的原始按鈕屬性時,他們與DataTemplate映射,所以我被迫使用綁定重新映射每個單獨的屬性(包括自定義屬性,因爲我實際上使用自定義用戶控件從Button繼承)。這似乎無關手動映射所有屬性,所以也許有更好的方法來自動持久這些屬性?DataTemplate在WPF ListView中顯示按鈕,同時保留屬性
這裏是我的測試代碼:
public MainWindow() {
InitializeComponent();
ObservableCollection<ScreenRequest> screenRequests = new ObservableCollection<ScreenRequest>() {
new ScreenRequest("A", "1"),
new ScreenRequest("B", "2")
};
myListView.ItemsSource = screenRequests;
}
public class ScreenRequest {
public CustomButton ScreenButton { set; get; }
public string Details { set; get; }
public ScreenRequest(string buttonText, string customProperty) {
this.ScreenButton = new CustomButton();
this.ScreenButton.Content = buttonText;
this.ScreenButton.CustomProperty = customProperty;
this.ScreenButton.Click += new RoutedEventHandler(InitiateScreenRequest);
}
private void InitiateScreenRequest(object sender, RoutedEventArgs e) {
CustomButton screenBtn = (CustomButton)sender;
screenBtn.Content = "BUTTON TEXT CHANGED";
}
}
public class CustomButton : Button {
public string CustomProperty { get; set; }
}
而XAML:
<Window...
...
<Window.Resources>
<DataTemplate x:Key="ButtonTemplate">
<local:CustomButton Content="{Binding ScreenButton.Content}"/>
</DataTemplate>
</Window.Resources>
<Grid x:Name="grdMain">
...
<ListView...
<ListView.View>
<GridView x:Name="gridView">
<GridViewColumn CellTemplate="{StaticResource ButtonTemplate}" Width="Auto" Header="Screen" HeaderStringFormat="Screen"/>
<GridViewColumn Header="Details" HeaderStringFormat="Details" DisplayMemberBinding="{Binding Details}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
所以我的問題是:
- 我必須在的CustomButton每一個屬性手動映射爲了讓它繼承到DataTemplate或是它們的一個全部自動持久化屬性?
- 如何在綁定中映射CustomProperty屬性,使其與按鈕保持一致?我爲此使用DependencyProperty?
- 如何維護我的點擊事件,使單擊GridView中的按鈕將調用InitiateScreenRequest函數?理想情況下,我希望爲所有按鈕聲明單個方法,但我還沒有得到這一點。
任何幫助或深入瞭解listview按鈕將不勝感激。
有點困惑。按鈕中的哪些屬性是你談論的,以及如何進行矯枉過正,因爲在DataTemplate中,您定義了模板和關聯樣式「once」,然後這些樣式將被重複用於集合中的每個元素。 – Viv
對於這個例子,我只想維護CustomButton的Content,CustomProperty和Click屬性。現在這並不過分,但是在考慮我是否有10多個Properites,並且必須映射它們中的每一個,而不是僅僅是「自動綁定」的方式。 如果我們被迫手動綁定所有東西,我想我知道如何使用DependencyProperty做CustomProperty,但不知道如何通過DataTemplate持久化Click事件。感謝您的評論。 –
老兄,我不知道'Screen'是什麼,但是你的'Data Items'不應該包含'UI Elements'的實例。也就是說,你不能在ViewModel中放置像ScreenButton這樣的東西。 –