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 関数が呼び出されるように、クリック イベントを維持するにはどうすればよいですか? 理想的には、すべてのボタンに対して 1 つのメソッドを宣言したいと考えていますが、まだその段階に達していません。
リストビューのボタンに関するヘルプや洞察をいただければ幸いです。