我正在研究在Windows XP Standard上运行的触摸屏应用程序.使用当前硬件来调用右键单击用户必须单击并保持几秒钟,但这可能会干扰其他操作,例如在滚动查看器中按住重复按钮,因此我决定禁用右键单击.
理想情况下,我不想在应用程序级别禁用右键,但如果不可能,禁用右键单击Windows级别也适用于我.
我的问题基本上就是这个问题.我认为这将有助于提供一些更容易重现问题的信息和代码.
使用RibbonControlsLibrary中的Microsoft.Windows.Controls.Ribbon.RibbonComboBox 感觉就像走过一个充满了bug的大沼泽,而不是你知道如何绕过它做的事情.
Anywho.我遇到的最大问题是数据绑定我的SelectedItem.
以下是我的开始(在我发现RibbonGallery之后?).在ComboBox的子元素上使用ItemsSource和SelectedItem,甚至在同一级别上已经给了我heebie-jeebies,但这似乎是正确的.
在示例应用程序中,我在ViewModel的构造函数中设置SelectedItem.但是,在运行应用程序时,不会显示SelectedItem.甚至VS设计师也正确地展示了"第二选择"!
正在运行应用
VS设计师: 
调试SelectedItem setter时,您会注意到多次传递.在第一次将它设置为ctor中的"第二个选项"(1,参见下面的调试日志)后,它将重置为null(2)(通过外部代码,我在控件本身中计算).在UI中打开下拉列表时,它将再次设置为null(3),然后在选择值时,将此值设置为两倍(4,5).我选择了"第二选项",然后用"第一选项"(6-9)重复该过程.这产生了以下日志(忽略了功能区控件中的一千零一个绑定异常...):

显而易见的大问题是(2),这是重置我的初始选择.看起来当第一次显示控件时,它会被重置.一个非常丑陋的解决方法是通过计时器设置值.在用户控件的Loaded事件中设置它在这个示例应用程序中对我有用,但在我较重的现实应用程序中,它没有.无论如何,所有这些都是错误的.有谁知道更好的解决方案?
XAML:
<UserControl x:Class="WpfApplication1.RibbonComboBoxDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:r="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<local:ViewModel />
</UserControl.DataContext>
<Grid>
<r:Ribbon >
<r:RibbonTab Header="First Tab">
<r:RibbonGroup Header="Group">
<r:RibbonComboBox >
<r:RibbonGallery SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<r:RibbonGalleryCategory ItemsSource="{Binding Controls}" DisplayMemberPath="Caption" />
</r:RibbonGallery>
</r:RibbonComboBox>
</r:RibbonGroup>
</r:RibbonTab>
<r:RibbonTab Header="Second Tab" />
</r:Ribbon>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
视图模型:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
namespace WpfApplication1
{
public class ViewModel …Run Code Online (Sandbox Code Playgroud) 我有一个PriorityBinding
<PriorityBinding FallbackValue="Bindings were null">
<Binding Path="Foo" />
<Binding Path="Bar" />
</PriorityBinding>
Run Code Online (Sandbox Code Playgroud)
我想这样做,如果Foo为null,它将使用Bar,如果两者都为null,它将使用FallbackValue.但是null是此属性的有效值,因为它只需要一个对象.
当值为null时,有没有办法让PriorityBinding前进到下一个绑定?我宁愿在XAML中这样做,但如果我不能,我只会为它做一个转换器.
编辑
我最后只为它写了一个转换器
public class NullToDependencyPropertyUnsetConverter
: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value ?? DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在WPF/MVVM应用程序中实现Mediator Pattern,以实现ViewModels之间的通信.
要应用中介模式,我从此链接下载了一个示例项目.然后我从样本中学到了它,然后我申请了我的示例项目.
我对这种模式的使用有一些问题,这反过来会产生荒谬的输出.
让我从我的代码开始:
这是我的项目结构:
SampleWPFMVVMMediatorApp
|
|--Data
| |--MenuItems.xml
|
|--Extensions
| |--MediatorX
| | |--IColleague.cs
| | |--Mediator.cs
| | |--Messages.cs
| | |--MultiDictionary.cs
| |--ViewModelBase.cs
|
|--Models
| |--MenuItem.cs
|
|--ViewModels
| |--MainWindowViewModel.cs
| |--ParentMenuViewModel.cs
| |--ChildMenuViewModel.cs
| |--SamplePageViewModel.cs
|
|--Views
| |--ParentMenuView.xaml
| |--ChildMenuView.xaml
| |--SamplePage.xaml
|
|--App.xaml
|--MainWindow.xaml
Run Code Online (Sandbox Code Playgroud)
码:
我将发布ViewModels和Models的代码以缩短问题的长度.
MenuItem.cs
public class MenuItem
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MainWindowViewModel.cs
public …Run Code Online (Sandbox Code Playgroud)