Jeśli trzeba uzyskać dane w ComboBox
z pojedynczego kliknięcie na pustym wierszu, proponuję użyć Caliburn.Micro do „dołączyć” polecenie przypadku DropDownOpened
swojej ComboBox
.
Oto próbka: Przede wszystkim XAML
<Window x:Class="WpfApplication1.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.caliburnproject.org"
Title="MainView" Height="600" Width="600"
Name="_window">
<DataGrid GridLinesVisibility="All" AutoGenerateColumns="False" ItemsSource="{Binding TestItemCollection}">
<DataGrid.Columns>
<DataGridTemplateColumn Width="*" Header="Test Column">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="150"
HorizontalAlignment="Left"
ItemsSource="{Binding TestChildCollection}"
cal:Message.Attach="[Event DropDownOpened] = [Action Choose($dataContext)]"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
wtedy ViewModel:
public class MainViewModel : Caliburn.Micro.PropertyChangedBase
{
public MainViewModel()
{
TestItemCollection = new ObservableCollection<TestClass>
{
new TestClass(),
new TestClass(),
new TestClass(),
};
}
public void Choose(object data)
{
if (!(data is TestClass))
{
TestItemCollection.Add(new TestClass());
}
}
public ObservableCollection<TestClass> TestItemCollection { get; set; }
}
Proszę zwrócić uwagę, że w moim próbki kodu TestClass
jest taka sama, że napisałeś. Oczywiście musisz skonfigurować swoją aplikację, aby pracować z Caliburn.Micro (jeśli nie wiesz jak to zrobić, możesz przeczytać documentation).
Jeśli nie chcesz (a może nie możesz) używać Caliburn.Micro, możesz uzyskać ten sam wynik, korzystając z biblioteki System.Windows.Interactivity (zobacz moją edycję poniżej).
Wypróbuj kod: wystarczy jedno kliknięcie, a nowy wiersz zostanie automatycznie utworzony. Mam nadzieję, że ci to pomoże.
EDIT: alternatywne rozwiązanie z System.Windows.Interactivity
Jeśli nie można używać Caliburn.Micro, wystarczy zmodyfikować XAML MAINVIEW w ten sposób:
<Window x:Class="WpfApplication1.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
Title="MainView" Height="600" Width="600"
Name="_window">
<DataGrid GridLinesVisibility="All" AutoGenerateColumns="False" ItemsSource="{Binding TestItemCollection}">
<DataGrid.Columns>
<DataGridTemplateColumn Width="*" Header="Test Column">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="150"
HorizontalAlignment="Left"
ItemsSource="{Binding TestChildCollection}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DropDownOpened">
<ei:CallMethodAction MethodName="ChooseWithInteraction"
TargetObject="{Binding ElementName=_window, Path=DataContext}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>
Jak widać , Właśnie dodałem odniesienia do Microsoft.Expression.Interactions i bibliotek System.Windows.Interactivity. Następnie dodałem EventTrigger i CallMethodAction do ComboBox
.
Teraz w MainViewModel
można zastąpić metodę Choose
z ChooseWithInteraction
jednej (oczywiście można też po prostu dodać go do kodu):
public void ChooseWithInteraction(object sender, EventArgs args)
{
object data = ((ComboBox)sender).DataContext;
if (!(data is TestClass))
{
TestItemCollection.Add(new TestClass());
}
}
W ten sposób można uzyskać takie samo zachowanie z mojej pierwsze rozwiązanie, ale bez użycia Caliburn.
Mam twój pomysł. To stworzy nową instancję TestClass w DataContext, ale nie otworzy Combobox z danymi. Tak jak wcześniej, najpierw wybierz wiersz i dopiero wtedy Combobox dostanie dane. – Spirosi
To nie jest w porządku @Spirosi. Przetestowałem swój kod za pomocą .NET 4 i Caliburn.Micro 2.0.2; jeśli kliknę na ostatni Combobox - umieszczony w "wierszu wstawiania" - otworzy się _ ** z danymi ** _ (tzn. "Pierwszy przedmiot testowy", "Drugi przedmiot testowy", "Trzeci element testowy" i " Czwarta pozycja testowa "). Czy otrzymujesz inne zachowanie? –
Testowałem to tylko z interakcyjnością. Spróbuję z Cliburnem. – Spirosi