数据绑定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