[英]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>
尝试使用AncestorType
和Mode
使用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,这是一个不错的起点 。
StepUp的代码似乎正确。
但是我不确定原因。 我的意思是,您的命令属性是在ViewModel(我们称为VM)中定义的,在ASUME中,您具有用作DataGrid上的ItemSource的集合(HldLogEQCurr)。 RowDetail用于1个元素,数量不多。 因此,您具有上述集合的1个元素作为DataContext。 而且由于在这些元素中未定义命令,因此找不到它。
另外,在“输出”窗口中,应该有警告指示绑定失败并提供更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.