我的绑定有问题,我不知道为什么。我正在使用Devexpress MVVM
。我有一个用户控件,我用它来填充基于我的ObservableCollection
的文本框,它运行良好。
我的用户控件中有这个xaml代码。
<ItemsControl IsTabStop="False" ItemsSource="{Binding ListControls}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding RGN_INdex}" />
<TextBox Text="{Binding RGN}" Grid.Column="1" >
<TextBox.InputBindings>
<KeyBinding Key="F1" Command="{Binding InsertControlCommand}" CommandParameter="{Binding Path=RGN_INdex }" />
</TextBox.InputBindings>
</TextBox>
<Label Grid.Column="2" Content="RSN:" />
<TextBox Text="{Binding RSN}" Grid.Column="3" />
<Label Grid.Column="4" Content="SGN:" />
<TextBox Text="{Binding SGN}" Grid.Column="5" />
<Label Grid.Column="6" Content="SN:" />
<TextBox Text="{Binding SN}" Grid.Column="7" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
以上代码一直有效,直到我添加InsertControlCommand
。
<TextBox.InputBindings>
<KeyBinding Key="F1" Command="{Binding InsertControlCommand}" CommandParameter="{Binding Path=RGN_INdex }" />
</TextBox.InputBindings>
它给了我:
System.Windows.Data Error: 40 : BindingExpression path error: 'InsertControlCommand' property not found on 'object' ''RelativesM' (HashCode=41849684)'. BindingExpression:Path=InsertControlCommand; DataItem='RelativesM' (HashCode=41849684); target element is 'KeyBinding' (HashCode=2666760); target property is 'Command' (type 'ICommand')
为什么当该命令与InsertControlCommand
ObservableCollection属于同一个类(ViewModel)时,它找不到ListControls
?
这是ViewModelBase
和InsertControlCommand
所在的ListControls
。
public abstract class ViewModelBase : INotifyPropertyChanged {
public DelegateCommand<object> InsertControlCommand { get; private set; }
public ObservableCollection<Model.RelativesM> ListControls { get; set; }
public ViewModelBase() {
InsertControlCommand = new DelegateCommand<object>(InsertControlEvent);
ListControls = new ObservableCollection<Model.RelativesM>();
}
}
然后我有这个MainViewModel:
public class MainViewModel : ViewModelBase {
}
然后在我的MainWindow.xaml上,我使用以下代码设置DataContext:
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
根据我的理解,我的代码应该可行。因为ListControls
和InsertControlCommand
使用相同的ViewModel,但命令却没有。是什么原因?我错过了什么?
答案 0 :(得分:2)
如果你这样绑定它,它不会在你的DataContext(MainViewModel)中查找InsertControlCommand,而是在RelativesM Class中查找。这显示在您的错误消息中:
&#39; InsertControlCommand&#39;在&#39; object&#39;上找不到的属性&#39;&#39; RelativesM&#39;
将命令的绑定更改为;
Command="{Binding DataContext.InsertControlCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}}"
它应该按照你的预期工作。
答案 1 :(得分:1)
为什么当该命令和ListControls ObservableCollection在同一个类(ViewModel)中时,它找不到InsertControlCommand?
因为TextBox
中的每个项目只有一个ObservableCollection<Model.RelativesM>
,而DataContext
的{{1}}是{{1}中的当前TextBox
模型对象而不是视图模型本身。
为了能够绑定到视图模型的属性,您可以使用@LittleBit建议的RelativesM
绑定:
ObservableCollection<Model.RelativesM>