在 WPF 中,我有一个 2 列的 ListView,第一列需要是一个按钮。如果我错了,请纠正我,但我发现在 ListView 中实现按钮的唯一方法是使用 DataTemplate。我发现的问题是当它们与 DataTemplate 映射时,我无法维护我的原始按钮属性,因此我不得不使用绑定来重新映射每个单独的属性(包括自定义属性,因为我实际上使用的是自定义用户控件它继承自 Button)。这似乎与手动映射所有属性无关,所以也许有更好的方法来自动保留这些属性?
这是我的测试代码:
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 函数?理想情况下,我希望为所有按钮声明一个方法,但我还没有达到这一点。
任何帮助或了解列表视图中的按钮将不胜感激。