项目面板模板上的自定义用户控件绑定
custom user control binding on itemspaneltemplate
我无法将用户控件上的自定义依赖项属性 绑定到我的 MVVM ViewModel。当我直接在我的视图中使用它时,我的用户控件可以正常工作:
<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0">
<Button x:Name="InfoBox1" Content="Test1" />
<Button x:Name="InfoBox2" Content="Test2" />
</local:CustomControl>
但是将它用作项目面板模板绑定不起作用:
<ItemsControl Grid.Row="0" ItemsSource="{Binding Equipment}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我试过使用 RelativeSource 并找到 itemscontrol/view 并将路径设置为 Mode 或 DataContext.Mode 但我就是无法使绑定工作。
模式定义为:
public static readonly DependencyProperty ModeProperty;
public Modes Mode
{
get { return (Modes)this.GetValue(ModeProperty); }
set { this.SetValue(ModeProperty, value); }
}
并在自定义控件的构造函数中注册:
public CustomControl()
{
Mode = Modes.Default;
}
static CustomControl()
{
ModeProperty = DependencyProperty.Register("Mode", typeof(Modes), typeof(CustomControl), new FrameworkPropertyMetadata(Mode.Default, OnModeChanged));
}
private static void OnModeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
CustomControl ctrl= o as CustomControl ;
if (ctrl== null) return;
Modes mode = (Modes)e.NewValue;
ctrl.Mode = mode;
}
我是否需要使用变通方法来使控件作为面板模板工作,还是我只是把绑定搞砸了?
----编辑
视图模型部分:
private Modes _mode= Modes.Default;
public Modes Mode
{
get { return _mode; }
set { _mode= value; NotifyPropertyChanged(); }
}
private ObservableCollection<EquipmentViewModel> _equipment;
public ObservableCollection<EquipmentViewModel> Equipment
{
get { return _equipment; }
set { _equipment = value; NotifyPropertyChanged(); }
}
----编辑2:
我进一步调查,我更复杂。我已将以下内容添加到 ItemsPanelTemplate 的控件和直接在网格中的控件中。
Visibility="{Binding Visible, Converter={StaticResource visibilityConverter}}"
改变这个 Visible 布尔值在这两种情况下都有效。所以这似乎只是自定义 DependencyProperty 的问题。
检查可视化树,控件的 DataContext 作为 ItemsPanelTemplate 也是正确的。
什么可以使依赖项 属性 在直接使用而不是在用作项目面板模板时正常工作?
找到导致奇怪的冲突行为的原因。
我在正常的 ctor
中将 属性 设置为某个值
public CustomControl()
{
Mode = Modes.Default;
}
在将控件用作项目面板模板时,这显然会导致冲突。删除它会使绑定按预期工作。
我想行为的差异与在不同时间调用构造函数有关?
我无法将用户控件上的自定义依赖项属性 绑定到我的 MVVM ViewModel。当我直接在我的视图中使用它时,我的用户控件可以正常工作:
<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0">
<Button x:Name="InfoBox1" Content="Test1" />
<Button x:Name="InfoBox2" Content="Test2" />
</local:CustomControl>
但是将它用作项目面板模板绑定不起作用:
<ItemsControl Grid.Row="0" ItemsSource="{Binding Equipment}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:CustomControl Mode="{Binding Mode, Mode=TwoWay}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我试过使用 RelativeSource 并找到 itemscontrol/view 并将路径设置为 Mode 或 DataContext.Mode 但我就是无法使绑定工作。
模式定义为:
public static readonly DependencyProperty ModeProperty;
public Modes Mode
{
get { return (Modes)this.GetValue(ModeProperty); }
set { this.SetValue(ModeProperty, value); }
}
并在自定义控件的构造函数中注册:
public CustomControl()
{
Mode = Modes.Default;
}
static CustomControl()
{
ModeProperty = DependencyProperty.Register("Mode", typeof(Modes), typeof(CustomControl), new FrameworkPropertyMetadata(Mode.Default, OnModeChanged));
}
private static void OnModeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
CustomControl ctrl= o as CustomControl ;
if (ctrl== null) return;
Modes mode = (Modes)e.NewValue;
ctrl.Mode = mode;
}
我是否需要使用变通方法来使控件作为面板模板工作,还是我只是把绑定搞砸了?
----编辑
视图模型部分:
private Modes _mode= Modes.Default;
public Modes Mode
{
get { return _mode; }
set { _mode= value; NotifyPropertyChanged(); }
}
private ObservableCollection<EquipmentViewModel> _equipment;
public ObservableCollection<EquipmentViewModel> Equipment
{
get { return _equipment; }
set { _equipment = value; NotifyPropertyChanged(); }
}
----编辑2: 我进一步调查,我更复杂。我已将以下内容添加到 ItemsPanelTemplate 的控件和直接在网格中的控件中。
Visibility="{Binding Visible, Converter={StaticResource visibilityConverter}}"
改变这个 Visible 布尔值在这两种情况下都有效。所以这似乎只是自定义 DependencyProperty 的问题。
检查可视化树,控件的 DataContext 作为 ItemsPanelTemplate 也是正确的。
什么可以使依赖项 属性 在直接使用而不是在用作项目面板模板时正常工作?
找到导致奇怪的冲突行为的原因。 我在正常的 ctor
中将 属性 设置为某个值public CustomControl()
{
Mode = Modes.Default;
}
在将控件用作项目面板模板时,这显然会导致冲突。删除它会使绑定按预期工作。
我想行为的差异与在不同时间调用构造函数有关?