WPF DataGridColumn MultiConverter参数是UnSetValue [英] WPF DataGridColumn MultiConverter Parameters are UnSetValue

查看:208
本文介绍了WPF DataGridColumn MultiConverter参数是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 =TopHorizo​​ntalAlignment =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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆