ListBox с DataTemplate распознает SelectedItem
У меня есть ListBox
с простым DataTemplate
, CheckBox
и TextBox
, Если пользователь проверяет CheckBox
Я хочу получить этот измененный предмет, как собственность SelectedItem
из ListBox
,
Как я могу получить элемент от List2
что изменилось?
MyListItem
:
public class MyListItem2 : ReactiveObject
{
private string _name;
public string Name
{
get { return _name; }
set
{
this.RaiseAndSetIfChanged(ref _name, value, "Name");
}
}
private bool _isMarked;
public bool IsMarked
{
get { return _isMarked; }
set
{
this.RaiseAndSetIfChanged(ref _isMarked, value, "IsMarked");
}
}
}
Посмотреть:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataTemplate.Views.MainWindow"
xmlns:viewsmodels="clr-namespace:DataTemplate.ViewModels;assembly=DataTemplate"
xmlns:dt="clr-namespace:DataTemplate;assembly=DataTemplate"
Title="DataTemplate" Width="700">
<Window.DataContext>
<viewsmodels:MainWindowViewModel />
</Window.DataContext>
<Grid ColumnDefinitions="250">
<ListBox Grid.Column="1" Items="{Binding List2}">
<ListBox.ItemTemplate>
<DataTemplate DataType="dt:MyListItem2">
<Grid ColumnDefinitions="50*,50*">
<CheckBox Grid.Column="0" Content="Mark" IsChecked="{Binding IsMarked}"/>
<TextBox Grid.Column="1" Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
ViewModel:
public class MainWindowViewModel : ReactiveObject
{
public ObservableCollection<MyListItem2> List2 { get; set; }
public MainWindowViewModel()
{
List2 = new ObservableCollection<MyListItem2>();
Random rand = new Random();
for (int i = 0; i < rand.Next(1, 20); i++)
{
MyListItem2 mli = new MyListItem2();
mli.Name = "ListItem" + i;
mli.IsMarked = false;
mli.PropertyChanged += ItemChanged;
List2.Add(mli);
}
}
private void ItemChanged(object sender, PropertyChangedEventArgs e)
{
var item = sender as MyListItem2;
Console.WriteLine(string.Format("changed: {0} {1}", item.Name, item.IsMarked));
}
}
3 ответа
Решение
Я вижу два пути:
- Поскольку вы используете MVVM, реализуйте интерфейс INotifyPropertyChanged в классе MyListItem2 ( справочник Microsoft по реализации INotifyPropertyChanged). Вызовите событие изменения свойства, когда значение / значение IsMarked установлено / изменено, затем подключитесь к обработчику события PropertyChanged элемента, чтобы определить, когда оно изменяется., ИЛИ ЖЕ
Если у вас есть codebehidn, добавьте обработчик событий "Проверено" и / или "Не проверено" на сам флажок из XAML. Показано ниже.
CheckBox Grid.Column = "0" Content = "Mark" IsChecked = "{Binding IsMarked}" />
Проверено = "IsMarked_Checked"
Codebehind
public void IsMarked_Checked(object sender, RoutedEventArgs e)
{
var ck = sender As Checkbox;
if (ck == null)
{
return;
}
// do whatever you need to here using the datacontext of the Checkbox
}
Попробуйте установить режим привязки:
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
Если вы хотите знать, когда флажок установлен / снят пользователем, вам нужно будет включить событие из флажка.
Используйте что-то вроде этого:
private void MyCheckBox_Checked(object sender, RoutedEventArgs e)
{
//check IsChecked of MyCheckBox here
}