2017-07-31 81 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