Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF组合框SelectedIndex属性绑定不工作_Wpf_Wpf 4.0 - Fatal编程技术网

WPF组合框SelectedIndex属性绑定不工作

WPF组合框SelectedIndex属性绑定不工作,wpf,wpf-4.0,Wpf,Wpf 4.0,我正在尝试将combobox的SelectedIndex属性绑定到我的ViewModel。这是代码 Xaml: <ComboBox x:Name="BloodGroupFilter" SelectedIndex="{Binding Path=SelectedBloodGroupIndex, Mode=TwoWay}"> <ComboBox.ItemsSource> <CompositeCollection> &l

我正在尝试将combobox的SelectedIndex属性绑定到我的ViewModel。这是代码

Xaml:

<ComboBox x:Name="BloodGroupFilter" SelectedIndex="{Binding Path=SelectedBloodGroupIndex, Mode=TwoWay}">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Foreground="red" FontStyle="Italic">No Filter</ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource BloodGroupEnum}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>
如您所见,我正在尝试将组合框的SelectedIndex设置为“4”。这不会发生,SelectedIndex设置为0。此外,当用户选择combobox的特定项时,我希望ViewModel的SelectedBloodGroupIndex属性将自身更新为combobox的当前选定项,但这种情况也不会发生。从未调用ViewModel属性(set和get)。上述代码绑定失败的任何原因

更新

<UserControl.Resources>
    <ObjectDataProvider x:Key="BloodGroupEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="enums:BloodGroup" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</UserControl.Resources>

您需要通知ViewModel的SelectedBloodGroupIndex的setter中更改的属性。我希望你对房地产交易有想法

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myWindow="clr-namespace:WpfApplication4"
    Title="MainWindow" Height="800" Width="800" WindowStartupLocation="CenterScreen">

<Grid>
    <ComboBox SelectedIndex="{Binding SelectedIndex}">
        <ComboBoxItem Content="1"/>
        <ComboBoxItem Content="2"/>
        <ComboBoxItem Content="3"/>
        <ComboBoxItem Content="4"/>
        <ComboBoxItem Content="5"/>
    </ComboBox>
</Grid>

如何以及在何处实例化ViewModel?您在哪里将其绑定到视图?我怀疑您没有正确设置
DataContext
。输出窗口是否显示绑定错误?ViewModel由Caliburn Micro引导程序创建。视图也是由Caliburn创建的。我在视图中有一些绑定到ViewModel的控件,这些绑定工作正常。这表明视图已正确绑定到ViewModel。唯一不起作用的是设置组合框的SelectedIndex,如我的问题中所述。您还可以告诉我们静态数据是什么样子吗?我已经更新了问题,以包括StaticResource键定义。我认为PropertyChanged与当前场景无关。尽管如此,我还是在SelectedBloodGroupIndex的setter中添加了代码,但它没有任何用处。问题是在安装过程中任何时候都没有调用Setter/Getter。我已经用示例更新了解决方案。如果它不是这样工作的,那么问题在于绑定。这是一个很好的捕获,但是当您仅从ViewModel更新视图时,
INotifyPropertyChanged
非常有用。OP在从视图更新ViewModel时遇到问题,而且getter和setter甚至没有被调用。
<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myWindow="clr-namespace:WpfApplication4"
    Title="MainWindow" Height="800" Width="800" WindowStartupLocation="CenterScreen">

<Grid>
    <ComboBox SelectedIndex="{Binding SelectedIndex}">
        <ComboBoxItem Content="1"/>
        <ComboBoxItem Content="2"/>
        <ComboBoxItem Content="3"/>
        <ComboBoxItem Content="4"/>
        <ComboBoxItem Content="5"/>
    </ComboBox>
</Grid>
 public partial class MainWindow :Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();
    }
}

public class MyViewModel :INotifyPropertyChanged
{
    public MyViewModel()
    {
        SelectedIndex = 2;
    }
    private int _selectedIndex;
    public int SelectedIndex 
    { 
        get
        {
            return _selectedIndex;
        }
        set
        {
            _selectedIndex = value;
            Notify("SelectedIndex");
        }
  }

    public event PropertyChangedEventHandler PropertyChanged;

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