数据绑定WPF DatagridComboBoxColumns到MVVM无法正常工作

在这些2的答案之后:

在MVVM中使用WPF DataGridComboBoxColumn - 在ViewModel中绑定到属性

用MVVM绑定WPF DataGridComboBoxColumn

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

组合框正在使用ViewModel中的列表填充,但值未被设置。

码:

<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列都会有相同的组合框列表。


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

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

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

例如

<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>

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


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。并且在此属性中,您可以获取并设置ComboBox.I的选定值希望这会有所帮助。


我最终不得不努力工作并继续进行该项目,这是一个带有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>
链接地址: http://www.djcxy.com/p/56217.html

上一篇: Databinding WPF DatagridComboBoxColumns to MVVM not working

下一篇: Wpf UserControl and MVVM