WPF Listbox +Button
От: khab  
Дата: 27.04.10 19:45
Оценка:
Я создал шаблон Listbox-а с кастомными items на которых кнопки, чекбоксы и прочее. Теперь передо мной встала следующая проблема:
При нажатии на кнопке внутри элемента листбокса я хочу получить доступ к тому элементу на котором находится эта кнопка, если посмотреть с точки зрения юзабилити получается как то неправильно, мне сначала приходится выбирать элемент из списка а уже затем нажимать на нем кнопку чтобы именно над этим элементом производились действия.
Основной вопрос: Как миновать такое лишнее действие, как сделать так чтобы срабатывающее при нажатии на кнопку событие производило действие над тем элементом, на котором находится эта кнопка.

Нашел еще такой пример в сети:

<Window x:Class="Listbox_Tunnel.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="388" Width="595" Loaded="Window_Loaded">
<Grid>
<ListBox Margin="40,25,96,41" Name="List_box_Check">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Height="16" Margin="0,0,0,3" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}">
CheckBox
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

</Grid>
</Window>

В этом примере на каждом элементе листбокса чекбокс, и когда нажимаешь на чекбокс выбирается элемент, но также происходит обратное действие когда выбираешь элемент срабатывает чекбокс. Что не совсем подходит.
Спасибо!
Re: WPF Listbox +Button
От: MxMsk Португалия  
Дата: 27.04.10 20:23
Оценка:
Здравствуйте, khab, Вы писали:

K>Я создал шаблон Listbox-а с кастомными items на которых кнопки, чекбоксы и прочее. Теперь передо мной встала следующая проблема:

K>При нажатии на кнопке внутри элемента листбокса я хочу получить доступ к тому элементу на котором находится эта кнопка, если посмотреть с точки зрения юзабилити получается как то неправильно, мне сначала приходится выбирать элемент из списка а уже затем нажимать на нем кнопку чтобы именно над этим элементом производились действия.
K>Основной вопрос: Как миновать такое лишнее действие, как сделать так чтобы срабатывающее при нажатии на кнопку событие производило действие над тем элементом, на котором находится эта кнопка.
Передавай элемент через параметр команды. Как-то так:
<Button ... CommandParameter={Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}} ... />

Тогда в обработчике команды ты сможешь получить ссылку на элемент ListBox, в котором лежит кнопка. Если захочешь, сможешь легко выделить его программно.
Re[2]: WPF Listbox +Button
От: khab  
Дата: 10.05.10 20:21
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, khab, Вы писали:


K>>Я создал шаблон Listbox-а с кастомными items на которых кнопки, чекбоксы и прочее. Теперь передо мной встала следующая проблема:

K>>При нажатии на кнопке внутри элемента листбокса я хочу получить доступ к тому элементу на котором находится эта кнопка, если посмотреть с точки зрения юзабилити получается как то неправильно, мне сначала приходится выбирать элемент из списка а уже затем нажимать на нем кнопку чтобы именно над этим элементом производились действия.
K>>Основной вопрос: Как миновать такое лишнее действие, как сделать так чтобы срабатывающее при нажатии на кнопку событие производило действие над тем элементом, на котором находится эта кнопка.
MM>Передавай элемент через параметр команды. Как-то так:
MM>
MM><Button ... CommandParameter={Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}} ... />
MM>

MM>Тогда в обработчике команды ты сможешь получить ссылку на элемент ListBox, в котором лежит кнопка. Если захочешь, сможешь легко выделить его программно.

Все таки я не въехал как это сделать, Оставим пока кнопку в покое.
попробую задать вопрос иначе, есть код:

<Window x:Class="Listbox_Tunnel.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="388" Width="595" Loaded="Window_Loaded">
<Grid>
<ListBox Margin="40,25,96,41" Name="List_box_Check">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1">
<Grid Height="35" Width="378" Name="grid1" VerticalAlignment="Bottom" Background="AntiqueWhite" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40*" />
<ColumnDefinition Width="298*" />
<ColumnDefinition Width="40*" />
</Grid.ColumnDefinitions>
<CheckBox Margin="8,9.52,0,9.48" Name="checkBox1" IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Checked="checkBox1_Checked" ></CheckBox>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

</Grid>
</Window>

На событие Checked="checkBox1_Checked" я повесил удаление элемента List_box_Check.Items.Remove(List_box_Check.SelectedValue)
Да элемент удаляется если я нажимаю на чекбокс, удаляется текущий, но если я нажимаю на этом элементе вне листбокса то он все равно удаляется, т.к. он селектится при нажатии в любой области элемента листбокса а не только чекбоксом, вот мне нужно чтобы он селектился только чекбоксом.
Re[3]: WPF Listbox +Button
От: MxMsk Португалия  
Дата: 10.05.10 22:28
Оценка:
Здравствуйте, khab, Вы писали:

K>Все таки я не въехал как это сделать, Оставим пока кнопку в покое.

K>попробую задать вопрос иначе, есть код:
Учись правильно оформлять XAML. Обернув его в теги [XML][/XML], ты значительно повысишь читабельность:
<Window x:Class="Listbox_Tunnel.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="388" Width="595" Loaded="Window_Loaded">
    <Grid>
        <ListBox Margin="40,25,96,41" Name="List_box_Check">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Black" BorderThickness="1">
                        <Grid Height="35" Width="378" Name="grid1" VerticalAlignment="Bottom" Background="AntiqueWhite" >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="40*" />
                                <ColumnDefinition Width="298*" />
                                <ColumnDefinition Width="40*" />
                            </Grid.ColumnDefinitions>
                            <CheckBox Margin="8,9.52,0,9.48" Name="checkBox1" 
                                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" 
                                      Checked="checkBox1_Checked" >
                            </CheckBox>
                        </Grid>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>        
    </Grid>
</Window>


K>На событие Checked="checkBox1_Checked" я повесил удаление элемента List_box_Check.Items.Remove(List_box_Check.SelectedValue)

K>Да элемент удаляется если я нажимаю на чекбокс, удаляется текущий, но если я нажимаю на этом элементе вне листбокса то он все равно удаляется, т.к. он селектится при нажатии в любой области элемента листбокса а не только чекбоксом, вот мне нужно чтобы он селектился только чекбоксом.
Выделенное не понял. Как ты нажимаешь на элементе вне ListBox, если он лежит внутри ListBox? Объясни плиз...
Если тебе нужно, чтобы ListBox выбирал элементы только, когда ты включаешь CheckBox, то я советую тебе отказаться от ListBox вообще, потому что перекрыть это поведение (когда нажатие на элемент, выделяет его) будет непросто. Проще ввести соответствующее свойство в объектах, к которым привязываются элементы списка, а в качестве спискового элемента использовать ItemsControl. В-общем, большая часть логики уйдет в модель, но это даже лучше.
Re[4]: WPF Listbox +Button
От: khab  
Дата: 11.05.10 07:38
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, khab, Вы писали:


K>>Все таки я не въехал как это сделать, Оставим пока кнопку в покое.

K>>попробую задать вопрос иначе, есть код:
MM>Учись правильно оформлять XAML. Обернув его в теги [XML][/XML], ты значительно повысишь читабельность:
MM>
MM><Window x:Class="Listbox_Tunnel.Window1"
MM>    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
MM>    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
MM>    Title="Window1" Height="388" Width="595" Loaded="Window_Loaded">
MM>    <Grid>
MM>        <ListBox Margin="40,25,96,41" Name="List_box_Check">
MM>            <ListBox.ItemTemplate>
MM>                <DataTemplate>
MM>                    <Border BorderBrush="Black" BorderThickness="1">
MM>                        <Grid Height="35" Width="378" Name="grid1" VerticalAlignment="Bottom" Background="AntiqueWhite" >
MM>                            <Grid.ColumnDefinitions>
MM>                                <ColumnDefinition Width="40*" />
MM>                                <ColumnDefinition Width="298*" />
MM>                                <ColumnDefinition Width="40*" />
MM>                            </Grid.ColumnDefinitions>
MM>                            <CheckBox Margin="8,9.52,0,9.48" Name="checkBox1" 
MM>                                      IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" 
MM>                                      Checked="checkBox1_Checked" >
MM>                            </CheckBox>
MM>                        </Grid>
MM>                    </Border>
MM>                </DataTemplate>
MM>            </ListBox.ItemTemplate>
MM>        </ListBox>        
MM>    </Grid>
MM></Window>
MM>


K>>На событие Checked="checkBox1_Checked" я повесил удаление элемента List_box_Check.Items.Remove(List_box_Check.SelectedValue)

K>>Да элемент удаляется если я нажимаю на чекбокс, удаляется текущий, но если я нажимаю на этом элементе вне листбокса то он все равно удаляется, т.к. он селектится при нажатии в любой области элемента листбокса а не только чекбоксом, вот мне нужно чтобы он селектился только чекбоксом.
MM>Выделенное не понял. Как ты нажимаешь на элементе вне ListBox, если он лежит внутри ListBox? Объясни плиз...
MM>Если тебе нужно, чтобы ListBox выбирал элементы только, когда ты включаешь CheckBox, то я советую тебе отказаться от ListBox вообще, потому что перекрыть это поведение (когда нажатие на элемент, выделяет его) будет непросто. Проще ввести соответствующее свойство в объектах, к которым привязываются элементы списка, а в качестве спискового элемента использовать ItemsControl. В-общем, большая часть логики уйдет в модель, но это даже лучше.


Да, сорри опечатка, я имел ввидну "вне чекбокса на элементе листбокса".
Ок посмотрю как использовать ItemsControl в этом деле, посмотрим что получится.
Что интересно я погуглил и не нашел ни одного примера со списком приблизительно похожего на то что мне нужно. Есть красивые но вот чтобы функционал внутри элемента был реализован нет.
Re[5]: WPF Listbox +Button
От: Codechanger Россия  
Дата: 11.05.10 12:58
Оценка:
Какой интересный сценарий — удаление при выделении . Однако вы сами связали свойство IsChecked со свойством IsSelected , и теперь имеете непонятное, по вашему, поведение.
Re[6]: WPF Listbox +Button
От: khab  
Дата: 11.05.10 18:42
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Какой интересный сценарий — удаление при выделении . Однако вы сами связали свойство IsChecked со свойством IsSelected , и теперь имеете непонятное, по вашему, поведение.


Ну это мне уже понятно что я так связал и получаю такое поведение, вот и хотел понять можно ли как нибудь эту связь сделать односторонней. Ну если сценарий немного странный допустим такой сценарий, что при нажатии на чекбокс элемент листбокса на котором этот чекбокс находится не удаляется а окрашивается в любой другой цвет, допустим серый (ну можно еще пофантазировать, становится как бы отличающимся в списке от остальных) а при нажатии на элементе списка вне чекбокса элемент списка просто выделяется.
Re[7]: WPF Listbox +Button
От: Codechanger Россия  
Дата: 12.05.10 06:55
Оценка:
Здравствуйте, khab, Вы писали:

K>Здравствуйте, Codechanger, Вы писали:


C>>Какой интересный сценарий — удаление при выделении . Однако вы сами связали свойство IsChecked со свойством IsSelected , и теперь имеете непонятное, по вашему, поведение.


K>Ну это мне уже понятно что я так связал и получаю такое поведение, вот и хотел понять можно ли как нибудь эту связь сделать односторонней. Ну если сценарий немного странный допустим такой сценарий, что при нажатии на чекбокс элемент листбокса на котором этот чекбокс находится не удаляется а окрашивается в любой другой цвет, допустим серый (ну можно еще пофантазировать, становится как бы отличающимся в списке от остальных) а при нажатии на элементе списка вне чекбокса элемент списка просто выделяется.


Используйте команды
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.