当在 DataGrid 中时,Popup 不绑定到 Toggle (xceed)
Popup doesn't bind to Toggle when inside DataGrid (xceed)
我制作了一个 Toggle,它扩展了一个 Popup window,里面有一个 ListBox
。看起来是这样的:
<ToggleButton Name="Toggle" Height="20" Width="150" >
<StackPanel>
<TextBlock Text="TestListPopup"/>
<Popup Height="200" Width="150"
IsOpen="{Binding ElementName=Toggle, Path=IsChecked}"
PlacementTarget="{Binding ElementName=Toggle}"
HorizontalAlignment="Left"
VerticalAlignment="Bottom">
<ListBox SelectionMode="Multiple" SelectionChanged="TypeSelectionChanged" >
<ListBoxItem Content="Test1"/>
<ListBoxItem Content="Test2"/>
<ListBoxItem Content="Test3"/>
</ListBox>
</Popup>
</StackPanel>
</ToggleButton>
它工作得很好,但我想在我的 xceed DataGrid
的 FilterRow
中使用它:
<xcdg:DataGridControl x:Name="dataGrid"
ItemsSource="{Binding Source={StaticResource DataSource}}">
<xcdg:DataGridControl.View>
<xcdg:TableflowView>
<xcdg:TableflowView.FixedHeaders>
<DataTemplate>
<xcdg:ColumnManagerRow/>
</DataTemplate>
<DataTemplate>
<xcdg:FilterRow>
<xcdg:FilterCell FieldName="Name" IsEnabled="True"/>
<xcdg:FilterCell FieldName="Type" IsEnabled="True">
<!-- TestListPopup control here -->
</xcdg:FilterCell>
</xcdg:FilterRow>
</DataTemplate>
</xcdg:TableflowView.FixedHeaders>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="Name" Title="Name" />
<xcdg:Column FieldName="Type" Title="Type" Width="160"/>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
虽然在这里,弹出窗口不会绑定到切换按钮。按下切换按钮不会执行任何操作。
我将其缩小到绑定被破坏,因为如果您设置 IsOpen="True",它是打开的(并且不遵守 PlacementTarget),但是又一次;它在 DataGrid 之外完美运行..
为什么功能完美的控件一旦放入 FilterRow
中就会中断?
感谢任何帮助! :)
Why does a perfectly functional control break once put inside the FilterRow
?
因为 ToggleButton
和 FilterCell
不属于同一个 namescope。
您可以尝试使用 x:Reference
:
进行绑定
IsOpen="{Binding Path=IsChecked, Source={x:Reference Toggle}}"
另一种选择是将 ToggleButton
的 IsChecked
属性 绑定到视图模型的 bool
属性 并绑定IsOpen
属性 的 Popup
同源 属性。确保视图模型实现 INotifyPropertyChanged
接口并在设置源 属性 时发出更改通知。
我制作了一个 Toggle,它扩展了一个 Popup window,里面有一个 ListBox
。看起来是这样的:
<ToggleButton Name="Toggle" Height="20" Width="150" >
<StackPanel>
<TextBlock Text="TestListPopup"/>
<Popup Height="200" Width="150"
IsOpen="{Binding ElementName=Toggle, Path=IsChecked}"
PlacementTarget="{Binding ElementName=Toggle}"
HorizontalAlignment="Left"
VerticalAlignment="Bottom">
<ListBox SelectionMode="Multiple" SelectionChanged="TypeSelectionChanged" >
<ListBoxItem Content="Test1"/>
<ListBoxItem Content="Test2"/>
<ListBoxItem Content="Test3"/>
</ListBox>
</Popup>
</StackPanel>
</ToggleButton>
它工作得很好,但我想在我的 xceed DataGrid
的 FilterRow
中使用它:
<xcdg:DataGridControl x:Name="dataGrid"
ItemsSource="{Binding Source={StaticResource DataSource}}">
<xcdg:DataGridControl.View>
<xcdg:TableflowView>
<xcdg:TableflowView.FixedHeaders>
<DataTemplate>
<xcdg:ColumnManagerRow/>
</DataTemplate>
<DataTemplate>
<xcdg:FilterRow>
<xcdg:FilterCell FieldName="Name" IsEnabled="True"/>
<xcdg:FilterCell FieldName="Type" IsEnabled="True">
<!-- TestListPopup control here -->
</xcdg:FilterCell>
</xcdg:FilterRow>
</DataTemplate>
</xcdg:TableflowView.FixedHeaders>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="Name" Title="Name" />
<xcdg:Column FieldName="Type" Title="Type" Width="160"/>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
虽然在这里,弹出窗口不会绑定到切换按钮。按下切换按钮不会执行任何操作。
我将其缩小到绑定被破坏,因为如果您设置 IsOpen="True",它是打开的(并且不遵守 PlacementTarget),但是又一次;它在 DataGrid 之外完美运行..
为什么功能完美的控件一旦放入 FilterRow
中就会中断?
感谢任何帮助! :)
Why does a perfectly functional control break once put inside the
FilterRow
?
因为 ToggleButton
和 FilterCell
不属于同一个 namescope。
您可以尝试使用 x:Reference
:
IsOpen="{Binding Path=IsChecked, Source={x:Reference Toggle}}"
另一种选择是将 ToggleButton
的 IsChecked
属性 绑定到视图模型的 bool
属性 并绑定IsOpen
属性 的 Popup
同源 属性。确保视图模型实现 INotifyPropertyChanged
接口并在设置源 属性 时发出更改通知。