繁体   English   中英

WPF数据绑定不起作用

[英]wpf data binding not working

我有一个数据网格。 当单击一行时,将显示详细信息。 在rowdetails中,我在数据网格旁边有另一个数据网格,其中有一些按钮。 我遇到的问题是绑定rowdetails中的按钮。 我单击按钮,但没有任何反应,我指出了ExecuteCommandButtRGHTSBoth方法后面的代码中有一个中断,它从未被击中。 我不明白为什么?

查看型号代码

    public ICommand CommandButtRGHTSCash { get; set; }
    public ICommand CommandButtRGHTSStock { get; set; }
    public ICommand CommandButtRGHTSBoth { get; set; }

   Void SetupButtons()
   {
        CommandButtRGHTSCash = new MyCommands(ExecuteCommandButtRGHTSCash, CanExecuteCommandButtRGHTSCash);
        CommandButtRGHTSStock = new MyCommands(ExecuteCommandButtRGHTSStock, CanExecuteCommandButtRGHTSStock);
        CommandButtRGHTSBoth = new MyCommands(ExecuteCommandButtRGHTSBoth, CanExecuteCommandButtRGHTSBoth);
   }


  private bool CanExecuteCommandButtRGHTSBoth(object parameter)
    {
        return true;
    }

    private void ExecuteCommandButtRGHTSBoth(object parameter)
    {
        for (int i = 0; i < SelectedHldLogEq.Funds.Count; i++)            
            // some code           
    }

MainWindow.xaml

<DataGrid Grid.Row="1"
                          ItemsSource="{Binding HldLogEQCurr, UpdateSourceTrigger=PropertyChanged}"
                          SelectedItem="{Binding SelectedHldLogEq, UpdateSourceTrigger=PropertyChanged}"
                          Style="{StaticResource DataGridTemplate1}"
                          ColumnHeaderStyle="{StaticResource DG_ColumnHeaderCenter1}"                                            
                          RowStyle="{StaticResource DG_Row1}"
                          CellStyle="{StaticResource DG_Cell1}"                                    
                          RowHeaderStyle="{StaticResource DG_RowHeader1}"                              
                          AutoGenerateColumns="False"
                          HorizontalAlignment="Stretch"                           
                          Background="Silver" 
                          Margin="50,50,50,50"                              
                          CanUserDeleteRows="False"
                          CanUserAddRows="False"
                          RowHeaderWidth="30">

                        <DataGrid.RowDetailsTemplate>
                            <DataTemplate>
                                <Grid x:Name="RowDetailGrid"            
                                      Margin="5"
                                      HorizontalAlignment="Left">
                                        <Border HorizontalAlignment="Left"
                                            VerticalAlignment="Top"
                                            Height="250"
                                            CornerRadius="5">
                                        <Border.Background>
                                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                                <GradientStop Offset="0" Color="Transparent"/>
                                                <GradientStop Offset="1" Color="Transparent"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="*"/>
                                                <RowDefinition Height="4*"/>
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="400"/>
                                                <ColumnDefinition Width="200"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock Grid.Row="0"
                                               Grid.Column="0"
                                               Margin="5,5,5,5"
                                               HorizontalAlignment="Left"
                                               FontSize="12"
                                               FontWeight="Bold"
                                               Foreground="Black" 
                                               Text="Select action to take">
                                            </TextBlock>
                                            <DataGrid Grid.Row="1" Grid.Column="0"  Grid.ColumnSpan="2"
                                                  ItemsSource="{Binding SelectedItem.Funds,  RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"                                                                  
                                                  RowStyle="{StaticResource DG_Row}"  
                                                  ColumnHeaderStyle="{StaticResource DG_ColumnHeader}" 
                                                  RowHeaderStyle="{StaticResource DG_RowHeaderNested}"
                                                  CellStyle="{StaticResource DG_Cell}" 
                                                  Background="Silver"
                                                  HorizontalGridLinesBrush="LightGray"
                                                  VerticalGridLinesBrush="LightGray"
                                                  CanUserAddRows="False"
                                                  CanUserDeleteRows="False"
                                                  Margin="50,5,5,20"
                                                  AutoGenerateColumns="False">
                                                <DataGrid.Columns>
                                                    <DataGridTextColumn Header="Fund Code" Binding="{Binding Code}" IsReadOnly="True" MinWidth="75"/>
                                                    <DataGridTextColumn Header="Fund Code SS" Binding="{Binding CodeSS}" IsReadOnly="True" MinWidth="75"/>
                                                    <DataGridTextColumn Header="Number of Rights" Binding="{Binding NewNominal, StringFormat={}{0:N0}}" IsReadOnly="True"/>
                                                    <DataGridCheckBoxColumn Header="Take Cash" Binding="{Binding OptionOne, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False">

                                                    </DataGridCheckBoxColumn>
                                                    <DataGridCheckBoxColumn Header="Take Stock" Binding="{Binding OptionTwo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False">

                                                    </DataGridCheckBoxColumn>
                                                </DataGrid.Columns>
                                            </DataGrid>

                                            <Grid Grid.Column="2" Grid.Row="0" Grid.RowSpan="2">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="180"/>
                                                    <ColumnDefinition/>
                                                    <ColumnDefinition/>
                                                    <ColumnDefinition/>
                                                </Grid.ColumnDefinitions>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="*"/>
                                                    <RowDefinition Height="4*"/>
                                                </Grid.RowDefinitions>

                                                <StackPanel Grid.Row="1" Grid.Column="0">
                                                    <Button Height="40" Width="150" Margin="0,5,0,0" Content="Take Cash" 
                                                        Command="{Binding CommandButtRGHTSCash}" Style="{StaticResource ButtonTemplate}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                                    <Button Height="40" Width="150" Margin="0,25,0,0" Content="Task Stock" 
                                                        Command="{Binding CommandButtRGHTSStock}" Style="{StaticResource ButtonTemplate}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                                    <Button Height="40" Width="150" Margin="0,25,0,0" Content="Take Both" 
                                                        Command="{Binding CommandButtRGHTSBoth}" Style="{StaticResource ButtonTemplate}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                                </StackPanel>

                                                <StackPanel Grid.Row="1" Grid.Column="1">
                                                    <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,5,5,5" HorizontalAlignment="Left" FontSize="12" FontWeight="Bold" Foreground="Black" 
                                                               Text="Select Date Effective From"/>
                                                    <DatePicker Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,25,0,0"
                                                                BorderThickness="0" SelectedDate="{Binding DateCheck, Mode=TwoWay}" Width="200"/>
                                                </StackPanel>

                                                <Button Grid.Row="1" Grid.Column="2" Height="40" Width="150" Margin="20,5,0,0" Content="Update Database" 
                                                        Command="{Binding CommandButtRGHTSExUpdate}" Style="{StaticResource ButtonTemplate}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                                            </Grid>

                                        </Grid>
                                    </Border>
                                </Grid>
                            </DataTemplate>
                        </DataGrid.RowDetailsTemplate>

                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Date Entered" IsReadOnly="True" Binding="{Binding DateEntered, StringFormat={}\{0:dd-MMM-yy\}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="75"/>
                            <DataGridTextColumn Header="Date Effective" IsReadOnly="True" Binding="{Binding DateEffective, StringFormat={}\{0:dd-MMM-yy\}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="75"/>
                            <DataGridTextColumn Header="Sedol" IsReadOnly="True" Binding="{Binding Security.Sedol}" MinWidth="75"/>
                            <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Security.Name}" MinWidth="200"/>
                            <DataGridTextColumn Header="Ratio" IsReadOnly="True" Binding="{Binding RatioNew}" MinWidth="75"/>

                        </DataGrid.Columns>
                    </DataGrid>

尝试使用AncestorTypeMode使用Window DataContext 让我举一个例子:

<Button Content="Take Cash" Command="{Binding DataContext.CommandButtRGHTSCash, 
RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}" 
Style="{StaticResource ButtonTemplate}" HorizontalAlignment="Left" 
VerticalAlignment="Center"/>

更新:

出色的开发人员@ AntonDanylov向我展示了一些不错的文章可供阅读:

关于DataContext,这是一个不错的起点

并且本文解释了DataGrid可能存在的问题。

StepUp的代码似乎正确。

但是我不确定原因。 我的意思是,您的命令属性是在ViewModel(我们称为VM)中定义的,在ASUME中,您具有用作DataGrid上的ItemSource的集合(HldLogEQCurr)。 RowDetail用于1个元素,数量不多。 因此,您具有上述集合的1个元素作为DataContext。 而且由于在这些元素中未定义命令,因此找不到它。

另外,在“输出”窗口中,应该有警告指示绑定失败并提供更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM