C# WPF/C中的条件事件处理程序#
我有一个场景,根据数据模型中的一些条件,我想为DockPanel/TextBlock上的拖放数据添加鼠标和键盘事件。如果该条件不存在,那么我不希望我的代码侦听这些事件C# WPF/C中的条件事件处理程序#,c#,wpf,xaml,C#,Wpf,Xaml,我有一个场景,根据数据模型中的一些条件,我想为DockPanel/TextBlock上的拖放数据添加鼠标和键盘事件。如果该条件不存在,那么我不希望我的代码侦听这些事件 <!-- Data Template with all event handlers --> <DataTemplate DataType="{x:Type ViewModels:EventsViewModel}"> <DockPanel Name="dpnMain">
<!-- Data Template with all event handlers -->
<DataTemplate DataType="{x:Type ViewModels:EventsViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}" MouseEnter="OnMouseEnter" MouseLeave="OnMouseLeave"
MouseLeftButtonUp="OnMouseLeftButtonUp"
PreviewMouseDown="DragDataMouseDown"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Data Template without event handlers -->
<DataTemplate DataType="{x:Type ViewModels:PlainViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithoutDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Content Control will select the appropriate data template based on the view model it is bound to -->
<ContentControl Focusable="False" Padding="0" Content="{Binding}"/>
我不想编写两个不同的数据模板,而是希望根据其viewModel类型进行选择。我需要一些能绑定到这些事件的值转换器
<!-- Data Template with all event handlers -->
<DataTemplate DataType="{x:Type ViewModels:EventsViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}" MouseEnter="OnMouseEnter" MouseLeave="OnMouseLeave"
MouseLeftButtonUp="OnMouseLeftButtonUp"
PreviewMouseDown="DragDataMouseDown"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Data Template without event handlers -->
<DataTemplate DataType="{x:Type ViewModels:PlainViewModel}">
<DockPanel Name="dpnMain">
<Button Name="btnSourceLink" DockPanel.Dock="Right" HorizontalAlignment="Right" Padding="0"
ClickMode="Press"
Click="Button_OnMouseButtonUp"
PreviewMouseDown="Button_DragDataMouseDown"
Content="{Binding Value, Converter={StaticResource RegionalDataFormatConverter}}"
ToolTip="{Binding Tooltip}"
ToolTipService.IsEnabled="{Binding IsTooltipAvailable}" />
<StackPanel Name="spnWithoutDragNDrop" DockPanel.Dock="Left">
<TextBlock HorizontalAlignment="Left" TextWrapping="NoWrap" ClipToBounds="True" Padding="0"
Text="{Binding Label}"
ToolTip="{Binding Label}"
Width="{Binding ElementName=spn, Path=ActualWidth, Mode=OneWay,
Converter={StaticResource WidthFromParent}, ConverterParameter=10}"/>
</StackPanel>
</DockPanel>
<DataTemplate>
<!-- Content Control will select the appropriate data template based on the view model it is bound to -->
<ContentControl Focusable="False" Padding="0" Content="{Binding}"/>
我是否可以编写一些转换器来避免编写另一个DataTemplates和View Model,转换器会在幕后查看这些情况?使用以下代码创建一个类:
public class MyTemplateSelector : DataTemplateSelector
{
private static DataTemplate _eventsViewModel;
private static DataTemplate EventsViewModel
{
get
{
if (_eventsViewModel== null)
_eventsViewModel= Application.Current.FindResource("EventsViewModel") as DataTemplate;
return _eventsViewModel;
}
}
private static DataTemplate _plainViewModel;
private static DataTemplate PlainViewModel
{
get
{
if (_plainViewModel== null)
_plainViewModel= Application.Current.FindResource("PlainViewModel") as DataTemplate;
return _plainViewModel;
}
}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if(item is EventsViewModel) return EventsViewModel;
else if(item is PlainViewModel) return PlainViewModel;
}
}
在资源标签中的xaml中:
<core:MyTemplateSelector x:Key="myTemplateSelector"/>
在xaml中:
<ContentPresenter ContentSource="{Binding}" ContentTemplateSelector="{StaticResource myTemplateSelector}"/>
能否检测侦听器中的条件,而忽略其中的事件?能否在实现中使用ICommand和附加的行为?@JonSkeet我现在就是这么做的。但我想知道是否有比这更好的解决方案。我知道我可以通过TemplateSelector或内容绑定来实现。例如,我们使用BooltVisibilityConverter作为每个绑定的ValueConverter。我正在寻找一些ValueConverter,它将设置绑定,而不是创建几个不同的数据模板,以便在两个模板中执行几乎相似的操作。如果您不想复制所有内容,可以使用ContentPresenter替换TextBlock,并为TextBlock的不同状态编写数据模板。