2017-07-31 87 views
2

我有一个ListBox,简单的DataTemplateCheckBoxTextBox。 如果用户检查CheckBox我想获取此更改的项目,如ListBox的属性SelectedItem带DataTemplate的ListBox识别SelectedItem

我怎样才能从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> 

视图模型:

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,实现对MyListItem2类(Microsoft Reference on INotifyPropertyChanged implementation)INotifyPropertyChanged接口。在设置/更改IsMarked值时引发属性更改事件,然后连接到该项目的PropertyChanged事件处理程序以确定它何时更改。 。 OR
  • 如果您有codebehidn,请在XAML的复选框本身上添加“Checked”和/或“Unchecked”事件处理程序。如下所示。

    复选框Grid.Column = “0” CONTENT = “标记”=器isChecked “{结合ISMARKED}”/>
    选中= “IsMarked_Checked”

代码隐藏

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 
} 
+0

对不起,我更新了问题。请注意,它是.net核心和AvaloniaUI。 – EinApfelBaum

+0

我把你的第一点和这个作品。我只需要将PropertyChanged事件路由到我的ViewModel。 我更新了问题中的代码。 – EinApfelBaum

0

如果您希望在复选框被选中/取消的知道用户需要从复选框触发事件。

使用这样的事情:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    //check IsChecked of MyCheckBox here 
} 
+0

对不起,我更新了问题。 请注意,它是.net核心和AvaloniaUI – EinApfelBaum

0

尝试设置装订模式:

SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
+0

我觉得棘手的部分是,当我改变文本或复选框时,'SelectedItem'不会改变。 – EinApfelBaum