2014-04-25 11 views
9

Tôi đang cố gắng ràng buộc một Hộp kiểm đến một trường nhưng cũng kích hoạt hộp kiểm IsSelected.C# WPF ListBox Checkbox Binding IsChecked vào một lĩnh vực và IsSelected?

Đây là thiết lập ListBox rằng đang làm việc với các ràng buộc dữ liệu

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding Checked ,Mode=TwoWay}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Và đây là đoạn code liên quan đến việc ràng buộc

public MainWindow() 
{ 
    InitializeComponent(); 

    List<CheckBoxListItem> items1 = new List<CheckBoxListItem>(); 
    items1.Add(new CheckBoxListItem(true, “home”)); 
    items1.Add(new CheckBoxListItem(false, “work”)); 
    items1.Add(new CheckBoxListItem(true, “cell”)); 
    lstExclude.ItemsSource = items1; 
} 

public class CheckBoxListItem 
{ 
    public bool Checked { get; set; } 
    public string Text { get; set; } 

    public CheckBoxListItem(bool ch, string text) 
    { 
    Checked = ch; 
    Text = text; 
    } 
} 

này liên kết với hộp kiểm giá trị kiểm tra một cách chính xác, nhưng nếu Tôi nhấp vào hộp kiểm (được chọn hoặc bỏ chọn), tôi muốn chọn mục này, vì vậy tôi đã thử làm theo cách này, vì vậy tôi đã thử làm theo cách này

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Vì vậy, điều này mang lại cho tôi kết quả của việc nhấp vào hộp kiểm (chọn hoặc bỏ chọn) và nó sẽ chọn mục. Vấn đề bây giờ là trường Checked không bị ràng buộc khi tôi thêm các mục.

Làm cách nào để bạn có thể chọn hộp kiểm cả hai được liên kết với trường Đã đánh dấu VÀ vẫn còn công việc IsSelected?

+0

bạn có thể sử dụng tính năng ghép kênh đa năng và MultiValueConverter –

Trả lời

3

Ok, tôi đã trả lời câu hỏi của riêng tôi (và có thể tốt hơn để làm điều này để cảm thấy cây để thêm) Tôi đã thêm một sự kiện Nhấp vào hộp kiểm như vậy

<ListBox x:Name="lstExclude" Grid.Column="2" SelectionMode="Single" > 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" 
      IsChecked="{Binding Checked ,Mode=TwoWay}" Click="CheckBox_Click"/> 
     </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

và sau đó thêm mã này cho Click Event

private void CheckBox_Click(object sender, RoutedEventArgs e) 
{ 
    var cb = sender as CheckBox; 
    var item = cb.DataContext; 
    lstExclude.SelectedItem = item; 
} 

Bây giờ mục được chọn khi bạn nhấp vào hộp kiểm (kiểm tra hoặc không kiểm soát) và mục có sẵn để phương pháp 'lstExclude.SelectedIndex'

Tôi hy vọng điều này sẽ giúp bất kỳ ai đến cùng với cùng một vấn đề.

14

Làm việc để liên kết cả thuộc tính giao diện người dùng với thuộc tính mô hình đối tượng Checked?

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding Checked, Mode=OneWay}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Text}" IsChecked="{Binding Checked}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

Tuyệt vời! Điều này hoạt động hoàn hảo. Cảm ơn bạn và cảm ơn bạn đã phản hồi nhanh. – user3573191

+0

Trên thực tế, có một vấn đề (và đó là vì từ ngữ của câu hỏi của tôi) - Tôi muốn mục được chọn bất cứ khi nào bạn nhấp vào hộp kiểm (bất kể nó được chọn hay không) - Xin lỗi. Bất kỳ ý tưởng? Cảm ơn. – user3573191

+0

@ user3573191 Trong quá khứ tôi đã sử dụng 'DataTrigger' đặt' IsSelected = "True" 'bất cứ khi nào' IsKeyboardFocusWithin' bằng true. Cú pháp trông giống như [this] (http://stackoverflow.com/a/8680879/302677). Đó có phải là ý bạn không? – Rachel

2

bạn có thể sử dụng một MultiBinding với MultiConverter

<CheckBox.IsChecked> 
<MultiBinding Converter="{StaticResource YourMultiBindConverter}"> 
       <Binding Path="IsSelected" RelativeSource={RelativeSource AncestorType=ListBoxItem}"/> 
       <Binding Path="Checked"/> 
</MultiBinding> 
</CheckBox.IsChecked> 

và tạo ra một YourMultiBindConverter mà thực hiện IMultiValueConverter

+0

Trên thực tế, có sự cố (và do từ ngữ của câu hỏi của tôi) - Tôi muốn mục được chọn bất cứ khi nào bạn nhấp vào hộp kiểm (bất kể nó được chọn hay không) tôi đã cập nhật câu hỏi - Xin lỗi. Ý tưởng nào? Cảm ơn. – user3573191

+0

Điều này thực sự đã giúp tôi rất nhiều vì tôi không cần phải ràng buộc với một giá trị cụ thể trong mô hình của tôi, nhưng một danh sách các giá trị. Khách hàng của tôi muốn hộp danh sách hiển thị séc cũng như các điểm nổi bật và điều này đã giúp tôi đạt được điều đó. Cảm ơn. – Tronald

1
<CheckBox Padding="10" 
      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
               ListBoxItem}}, Path=IsSelected}"> 
     <CheckBox.LayoutTransform> 
        <ScaleTransform ScaleX="1" ScaleY="1" /> 
     </CheckBox.LayoutTransform> 
    </CheckBox> 
Các vấn đề liên quan