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
}
Другие вопросы по тегам