根据来源更改列样式

时间:2012-06-04 17:01:40

标签: c# wpfdatagrid

我正在尝试使用一列作为组合框填充数据网格,但我需要在绑定到组合框的集合为空时,该列成为文本框列。我已经将列定义如下:

绑定绑定= new Binding(“DataContext.Prices”); binding.RelativeSource = new RelativeSource(RelativeSurceMode.FindAncestor,typeof(UserControl),1);

DataGridComboBoxColumn productPrices = new DataGridComboBoxColumn()
{
   ElementSyle = new Style
   {
        TargetType = typeof(ComboBox),
        Setters =
        {
            new Setter
            {
                Property=ComboBox.ItemsSourceProperty,
                Value= binding
            }
        }
   },
   EditingElementSyle = new Style
   {
        TargetType = typeof(ComboBox),
        Setters =
        {
            new Setter
            {
                Property=ComboBox.ItemsSourceProperty,
                Value= binding
            }
        }
   },
   DisplayMemberPath = new Binding("Price");
   SelectedValuePath = new Bindnt("Price");
};

myDataGrid.Columns.Add(productPrices);
myDataGrid.Columns.Add(new DataGridTextColumn(){ Header="Name", Binding=new Binding("Name")});

我定义了myDataGrid:

<DataGrid Name="myDataGrid" ItemsSource="{Binding Products}" />

在我的viewmodel中,我创建了一个

var products = new List<Product>
{
    new Product 
    {
       Name="Prod 1",
       Price="12.5"
    }
}
var prices = new List<PriceL>
{
    new PriceL
    {
       Price="12.5"
    },
    new PriceL
    {
       Price="10"
    }

}

ICollectionView Products = CollectionViewSource.GetDefaultView(products);
ICollectionView Prices = CollectionViewSource.GetDefaultView(prices);

我需要当“价格”为空时,列变为文本框我正在使用MVVM,我尝试使用elementStyle,但我看不到Combobox中的任何事件让我验证它的数据源。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

我刚刚找到了一种方法

<UserControl.Resources>
    <DataGrid ItemsSource={binding} x:Key="DataGrid1">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{ID}"/>
            <DataGridTextColumn Binding="{Name}"/>
        </DataGrid.Columns>
    </DataGrid>
    <DataGrid ItemsSource={binding} x:Key="DataGrid2">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{ID}"/>
            <DataGridCheckBoxColumn Binding="{Accepted}"/>
        </DataGrid.Columns>
    </DataGrid>

</UserControl.Resources>
<Grid>
    <ContentControl Content="{StaticResource DataGrid1}" DataContext="{Binding MyTable}" Name="myContent"/}    
</Grid>

Y por codigo puede cambiar el content

myContent.Content = this.FindResource(“DataGrid 2”);

答案 1 :(得分:0)

您是否考虑过触发所需视觉变化的行为,例如DataStateBehavior?您可能希望在VM中放入一个布尔属性,该属性检测源是否有效,该行为可以触发。