WPF DataGridColumn MultiConverter参数是UnSetValue [英] WPF DataGridColumn MultiConverter Parameters are UnSetValue
问题描述
我的问题总是转换器的第二个参数是 DependencyProperty.UnSetValue
。我无法解决这个问题。我尝试许多事情,并在论坛中提出类似主题的解决方案,但是再次失败了。如果我使用itemscontrol而不是datagrid,没有任何问题和代码可行,但是我必须使用数据网格。
ItemsControl ItemsSource ={Binding Definitions}DataContext ={Binding Test}>
< ItemsControl.ItemTemplate>
< DataTemplate DataType ={x:类型定义:定义}>
< Expander Header ={Binding Name}x:Name =expanderWidth =700VerticalAlignment =TopHorizontalAlignment =LeftDataContext ={Binding}IsExpanded =True> 。
< Grid>
< Grid.RowDefinitions>
< RowDefinition Height =30/>
< RowDefinition Height =*/>
< /Grid.RowDefinitions>
< Grid Grid.Row =0>
< / Grid>
< Grid Grid.Row =1Margin =0,5,0,0>
< DataGrid DataContext ={Binding Path = DataContext,ElementName = expander}ItemsSource ={Binding Items}CanUserAddRows =TrueAutoGenerateColumns =False>
< DataGrid.Columns>
< DataGridTextColumn Header =NameBinding ={Binding Name}IsReadOnly ={Binding Path = AutoNamed,Mode = TwoWay}/>
< DataGridComboBoxColumn DisplayMemberPath =IDSelectedValuePath =NumberHeader = - SelectedValueBinding ={Binding Path = Start,Mode = TwoWay}>
< DataGridComboBoxColumn.ItemsSource>
< MultiBinding Converter ={StaticResource Converter}>
< Binding Path =Test.TypesSource ={x:Static viewmodels:ApplicationVM.Instance}/>
< Binding Path =DataContext.NameElementName =expander/>
< / MultiBinding>
< /DataGridComboBoxColumn.ItemsSource>
< / DataGridComboBoxColumn>
< DataGridComboBoxColumn Header =+DisplayMemberPath =IDSelectedValuePath =NumberSelectedValueBinding ={Binding Path = End,Mode = TwoWay}>
< DataGridComboBoxColumn.ItemsSource>
< MultiBinding Converter ={StaticResource Converter}>
< Binding Path =Test.TypesSource ={x:Static viewmodels:ApplicationVM.Instance}/>
< Binding Path =HeaderElementName =expander/>
< / MultiBinding>
< /DataGridComboBoxColumn.ItemsSource>
< / DataGridComboBoxColumn>
< DataGridTextColumn Header =LowBinding ={Binding Path = Low,Mode = TwoWay}/>
< DataGridTextColumn Header =HighBinding ={Binding Path = High,Mode = TwoWay}/>
< DataGridCheckBoxColumn Header =自动名称Binding ={Binding Path = AutoNamed,Mode = TwoWay}/>
< /DataGrid.Columns>
< / DataGrid>
< / Grid>
< / Grid>
< / Expander>
< / DataTemplate>
< /ItemsControl.ItemTemplate>
< / ItemsControl>
首先,我认为这可能是有约束力的问题。所以,我添加了两个新的列来测试。
< DataGridTextColumn Header =Name2Binding ={Binding Path = Header ,ElementName = expander}/>
< DataGridTextColumn Header =Name3Binding ={Binding Path = DataContext.Name,ElementName = expander}/>
这两列工作。我可以看到它不是绑定的数据问题,但是作为参数而不是视图模型属性发送的是转换器中的 UnSetValue
。怎么可能?它还从 ItemsControl
继承。我不能将父数据文本绑定到datagrid。如何解决这个问题?我很高兴得到帮助。
提前感谢
您应该设置 ItemsSource
code> ElementStyle 和 EditingElementStyle
中的 ComboBox
的属性 DataGridComboBoxColumn
。然后,您可以使用 RelativeSource
绑定到 Expander
:
$ _ code&$ DataGrid DataContext ={Binding Path = DataContext,ElementName = expander}ItemsSource ={Binding Items}
CanUserAddRows =TrueAutoGenerateColumns =False >
< DataGrid.Resources>
< Style x:Key =PlusColumnStyleTargetType =ComboBox>
< Setter Property =ItemsSource>
< Setter.Value>
< MultiBinding Converter ={StaticResource Converter}>
<! - < Binding Path =Test.TypesSource ={x:Static viewmodels:ApplicationVM.Instance}/> - >
< Binding Path =HeaderRelativeSource ={RelativeSource AncestorType = Expander}/>
< / MultiBinding>
< /Setter.Value>
< / Setter>
< / Style>
< /DataGrid.Resources>
< DataGrid.Columns>
< DataGridComboBoxColumn Header =+DisplayMemberPath =IDSelectedValuePath =Number
SelectedValueBinding ={Binding Path = End,Mode = TwoWay}
ElementStyle ={StaticResource PlusColumnStyle }EditingElementStyle ={StaticResource PlusColumnStyle}/>
<! - +其他列...-->
< /DataGrid.Columns>
< / DataGrid>
不要设置 ItemsSource
属性 DataGridComboBoxColumn
本身。这将无法正常工作,因为 DataGridColumn
不是可视化的 UIElement
,它被添加到视觉树中,所以它赢得了'不能找到 Expander
。
My problem is always Converter's second parameter which is DependencyProperty.UnSetValue
. I cannot fix that. I try many things and suggested solution in similar topics in forums but again I failed. If I use itemscontrol instead of datagrid, there is no any problem and code works but I have to use data grid.
<ItemsControl ItemsSource="{Binding Definitions}" DataContext="{Binding Test}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type definitions:Definition}">
<Expander Header="{Binding Name}" x:Name="expander" Width="700" VerticalAlignment="Top" HorizontalAlignment="Left" DataContext="{Binding}" IsExpanded="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
</Grid>
<Grid Grid.Row="1" Margin="0,5,0,0">
<DataGrid DataContext="{Binding Path=DataContext, ElementName=expander}" ItemsSource="{Binding Items}" CanUserAddRows="True" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="{Binding Path=AutoNamed,Mode=TwoWay}" />
<DataGridComboBoxColumn DisplayMemberPath="ID" SelectedValuePath="Number" Header="-" SelectedValueBinding="{Binding Path=Start,Mode=TwoWay}">
<DataGridComboBoxColumn.ItemsSource>
<MultiBinding Converter="{StaticResource Converter}">
<Binding Path="Test.Types" Source="{x:Static viewmodels:ApplicationVM.Instance}" />
<Binding Path="DataContext.Name" ElementName="expander" />
</MultiBinding>
</DataGridComboBoxColumn.ItemsSource>
</DataGridComboBoxColumn>
<DataGridComboBoxColumn Header="+" DisplayMemberPath="ID" SelectedValuePath="Number" SelectedValueBinding="{Binding Path=End,Mode=TwoWay}">
<DataGridComboBoxColumn.ItemsSource>
<MultiBinding Converter="{StaticResource Converter}">
<Binding Path="Test.Types" Source="{x:Static viewmodels:ApplicationVM.Instance}" />
<Binding Path="Header" ElementName="expander" />
</MultiBinding>
</DataGridComboBoxColumn.ItemsSource>
</DataGridComboBoxColumn>
<DataGridTextColumn Header="Low" Binding="{Binding Path=Low,Mode=TwoWay}" />
<DataGridTextColumn Header="High" Binding="{Binding Path=High,Mode=TwoWay}" />
<DataGridCheckBoxColumn Header="Auto Name" Binding="{Binding Path=AutoNamed,Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Grid>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Firstly, I thought it could be the binding issue. So, I added two new column to test.
<DataGridTextColumn Header="Name2" Binding="{Binding Path=Header, ElementName=expander}"/>
<DataGridTextColumn Header="Name3" Binding="{Binding Path=DataContext.Name, ElementName=expander}"/>
These two columns worked. I can see it is not binding data issue, but what I send as parameter instead of view model property is UnSetValue
in Converter. How can it be possible? It is also inherited from ItemsControl
. I can not bind parent datacontext to datagrid. How can I solve this problem? I am glad to get help about it.
Thanks in advance.
You should set the ItemsSource
property of the ComboBox
in the ElementStyle
and EditingElementStyle
of the DataGridComboBoxColumn
. You can then use a RelativeSource
to bind to the Expander
:
<DataGrid DataContext="{Binding Path=DataContext, ElementName=expander}" ItemsSource="{Binding Items}"
CanUserAddRows="True" AutoGenerateColumns="False">
<DataGrid.Resources>
<Style x:Key="PlusColumnStyle" TargetType="ComboBox">
<Setter Property="ItemsSource">
<Setter.Value>
<MultiBinding Converter="{StaticResource Converter}">
<!--<Binding Path="Test.Types" Source="{x:Static viewmodels:ApplicationVM.Instance}" />-->
<Binding Path="Header" RelativeSource="{RelativeSource AncestorType=Expander}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridComboBoxColumn Header="+" DisplayMemberPath="ID" SelectedValuePath="Number"
SelectedValueBinding="{Binding Path=End,Mode=TwoWay}"
ElementStyle="{StaticResource PlusColumnStyle}" EditingElementStyle="{StaticResource PlusColumnStyle}"/>
<!-- + the other columns...-->
</DataGrid.Columns>
</DataGrid>
Don't set the ItemsSource
property of the DataGridComboBoxColumn
itself. This won't work because a DataGridColumn
is not a visual UIElement
that gets added to the visual tree so it won't be able to find the Expander
.
这篇关于WPF DataGridColumn MultiConverter参数是UnSetValue的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!