Поиск кнопки управления щелчком в wpf-сетке данных SelectionChanged - PullRequest
0 голосов
/ 13 марта 2012

Моя сетка данных имеет следующий код:

        <my:DataGrid Name="dgSupplierList" SelectionMode="Single"   CanUserResizeColumns="False" CanUserResizeRows="False"   
                 Margin="10,10,10,10"  AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" GridLinesVisibility="All" Background="Transparent"
                 RowHeight="23" RowBackground="White" AlternatingRowBackground="AliceBlue" SelectionUnit="FullRow" ColumnHeaderHeight="25"
                 OverridesDefaultStyle="True"  SelectionChanged="dgSupplierList_SelectionChanged" Grid.Row="1">
            <my:DataGrid.RowStyle>
                <Style TargetType="my:DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="White"/>
                            <Setter Property="Foreground" Value="White"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </my:DataGrid.RowStyle>
            <my:DataGrid.Columns>
                <my:DataGridTextColumn Binding="{Binding SupplierId}" Header="Supplier ID"  Visibility="Hidden" ></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding FullName}" Header="Organization" Width="225" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding ChartName}" Header="Chart Name" Width="150" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding ORG_ID}" Header="ID" Width="50" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding Country}" Header="Country" Width="125" IsReadOnly="True"></my:DataGridTextColumn>
                <dg:DataGridTemplateColumn x:Name="AddStakeholders" Width="100" Header="Add Stakeholders" CanUserResize="False">
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Background="Transparent" BorderBrush="Transparent"   Height="25" Tag="{Binding SupplierId}" CommandParameter="{Binding SupplierId}"   Name="btnAdd" Click="btnAdd_Click" >
                                <Image    Stretch="Uniform"  Margin="0,0,0,0"  Source="/ADES;component/Images/addimage.jpg"   />
                            </Button>
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>
            </my:DataGrid.Columns>

        </my:DataGrid>

При нажатии кнопки btnAdd вызывается код метода btnAdd_Click.Но поскольку кнопка в сетке данных, перед выполнением метода btnAdd_Click, выполняется dgSupplierList_SelectionChanged.Я хочу пропустить выполнение блока кода dgSupplierList_SelectionChanged, если щелкнуть btnAdd.Как я могу это сделать?

Как я могу проверить, является ли это щелчком элемента управления btnAdd внутри dgSupplierList_SelectionChanged, чтобы я мог пропустить код в нем?

Ответы [ 2 ]

0 голосов
/ 24 марта 2014

Ваш ответ на самом деле работал для меня, но я не могу поднять его из-за правил переполнения стека :-). Проблема, с которой я столкнулся, заключается в том, что мне пришлось дважды нажать кнопку, чтобы заставить ее выполнить команду. Один раз для выбора строки, один раз для нажатия кнопки.

Обычно я просто связываю команду в сетке данных, и она будет работать,

   <Button  Style="{StaticResource LinkButton}" Content="Remove" Command="{Binding DataContext.RemoveCommand, Source={StaticResource ProxyElement}}" CommandParameter="{Binding}" />

Но, как указано выше, это не сработало.

Вот что я должен был сделать.

 <Button PreviewMouseDown="UIElement_OnPreviewMouseDown" Style="{StaticResource   LinkButton}" Content="Remove" />

  private void UIElement_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) {
    ViewModel.RemoveCommand.Execute(((sender as Button).DataContext));
  }

Это помогло с сеткой данных, но это, конечно, не очень хорошее решение MVVM, и мне даже больно это делать. Я использую WPF 3.5, поэтому, возможно, MS исправила эту проблему в WPF 4.0.

0 голосов
/ 17 марта 2012

Пара хаков:

  1. удалить событие Click, в вашем OnSelectionChanged вы перемещаетесь по визуальному дереву, чтобы увидеть тип diff из TextBlock и кнопки, если это кнопка, сделайте там свою особую логику.

  2. добавьте DataGrid Mouse.PreviewMouseDown = "OnPreviewMouseDown" ... это сработает до Click или SelectionChanged ... так что вы можете добавить свою логику туда.

  3. Очиститель будет связывать:

    DataGrid's SelectedItem = "{Binding MySelectedItem}"

    Button's Command = "{Команда связывания}"

    Таким образом, оба будут установлены независимо от вашей ViewModel или кода, где вы можете сказать, сено, если мои выбранные элементы таковы, я не собираюсь выполнять команду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...