将WPF DatagridComboBoxColumns数据绑定到MVVM不起作用

时间:2012-08-10 16:57:53

标签: c# wpf mvvm caliburn.micro

按照以下2中的答案:

Using WPF DataGridComboBoxColumn with MVVM - Binding to Property in ViewModel

Binding a WPF DataGridComboBoxColumn with MVVM

1)当在组合框中进行选择时,我无法获取ObservableCollections中的值。

组合框正在使用ViewModel中的List进行填充,但未设置值。

代码:

<DataGrid ItemsSource="{Binding SidValues1through5, Mode=TwoWay}"                                  
     AutoGenerateColumns="False"
     Grid.Row="1"   
     Margin="5"
     VerticalAlignment="Top"
     HorizontalAlignment="Center">
     <DataGrid.Columns>
           <DataGridComboBoxColumn Header="1"
                                   Width="100"
                                   SelectedValueBinding="{Binding Value1}"
                                   SelectedValuePath="Value1">
                                    <DataGridComboBoxColumn.ElementStyle>
                                        <Style TargetType="ComboBox">
                                            <Setter Property="ItemsSource"
                                                    Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
                                        </Style>
                                    </DataGridComboBoxColumn.ElementStyle>
                                    <DataGridComboBoxColumn.EditingElementStyle>
                                        <Style TargetType="ComboBox">
                                            <Setter Property="ItemsSource"
                                                    Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
                                        </Style>
                                    </DataGridComboBoxColumn.EditingElementStyle>
                                </DataGridComboBoxColumn>

ViewModel接口(我已调试并连接到ViewModel,视图上的其他控件绑定正确:

ETA:BindableCollection继承自ObservableCollection,它是Caliburn.Micro类型。

public interface ICustomSIDViewModel : IScreen
{
    BindableCollection<SidValues> SidValues1through5 { get; set; }
    BindableCollection<SidValues> SidValues6through10 { get; set; }

    IList<string> AvailableSids { get; }
}

public class SidValues
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
    public string Value3 { get; set; }
    public string Value4 { get; set; }
    public string Value5 { get; set; }
}

2)一旦我解决了这个问题,有一种更简洁的方法让所有列都继承这一组DataGridComboBoxColumn.ElementStyle和DataGridComboBoxColumn.EditingElementStyle?

我问的原因是有10列都具有相同的组合框列表。

3 个答案:

答案 0 :(得分:0)

SelectedValueBinding="{Binding SelectedValue, Mode=TwoWay}"
                                       SelectedValuePath="Value1">

private string selectedValue;
    public string SelectedValue 
    {
        get
        {
            return selectedValue;
        }
        set
        {
            selectedValue = value;
            Notify("SelectedValue");
        } 
    }

    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

你正在绑定Collection的一个属性,它是你的ComboBox的ItemsSource,这是错误的。它应该像你应该有单独的Property作为上面的SelectedValue并将此属性绑定到ComboBox的SelectedValue.And在这个属性你可以得到并设置ComboBox的Selected值。我希望这会有所帮助。

答案 1 :(得分:0)

对于第一个问题 - 它是WPF,因此您不需要在绑定上使用Mode = TwoWay,但为了以防万一,请尝试使用它。

WPF afaik的默认值是TwoWay,但不适用于SL。无论如何都要试试。

对于第二个问题,只需在资源字典中声明一个嵌套样式。嵌套样式适用于目标控件的子元素

e.g。

<Style x:Key="DataGridComboBoxStyle" TargetType="DataGrid">
    <!-- Nested -->
    <Style.Resources>
            <Style TargetType="ComboBox">
                <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.AvailableSids}" />
            </Style>
    </Style.Resources>
</Style>

您还可以将样式应用于整个控件,并将该样式嵌套在该样式中:)

答案 2 :(得分:0)

我最终不得不继续工作并继续使用该项目是一个带有GridView的ListView。不完全相同但看起来相似。

我仍然对如何让DataGrid实际使用MVVM和Caliburn.Micro感到好奇,我尝试了我发现的每个例子,并且无法通过组合框选择来更新VM上的任何内容。

这是我的解决方案:

<ListView.View>
    <GridView>                                    
        <GridViewColumn Header="1"
                       Width="100">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=DataContext.AvailableSids,
                                        RelativeSource={RelativeSource FindAncestor, 
                                        AncestorType={x:Type UserControl}}}"
                              SelectedItem="{Binding Path=Value1, Mode=TwoWay, 
                                              UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>  
</ListView.View>