我正在尝试编写一个函数,它基本上将字符串数组转换为字符串数组,其中数组中的所有双精度数都舍入为我设置的小数位数.数组中也可以有字符串,它们根本没有双重值.
string[,] values = new string[1, 3];
values[0, 0] = "hello";
values[0, 1] = "0.123";
values[0, 2] = "0,123";
int decimalPlaces = 2;
double tmp;
string format = "F" + decimalPlaces.ToString();
IFormatProvider provider = CultureInfo.InvariantCulture;
for (int i = 0; i < values.GetLength(0); i++)
{
for (int j = 0; j < values.GetLength(1); j++)
{
if (double.TryParse(values[i, j], out tmp))
{
values[i, j] = tmp.ToString(format, provider);
}
}
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
结果必须是:"你好","0.12","0.12",但它是"你好","123.00","0.12"将以错误的方式对待逗号.有没有人有一个简单而有效的解决方案?
我有一个Datagrid,并且不喜欢我的解决方法在我的viewmodel上为单击的(也就是选定的)行触发双击命令.
视图:
<DataGrid EnableRowVirtualization="True"
ItemsSource="{Binding SearchItems}"
SelectedItem="{Binding SelectedItem}"
SelectionMode="Single"
SelectionUnit="FullRow">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<cmd:EventToCommand Command="{Binding MouseDoubleClickCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
...
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
视图模型:
public ICommand MouseDoubleClickCommand
{
get
{
if (mouseDoubleClickCommand == null)
{
mouseDoubleClickCommand = new RelayCommand<MouseButtonEventArgs>(
args =>
{
var sender = args.OriginalSource as DependencyObject;
if (sender == null)
{
return;
}
var ancestor = VisualTreeHelpers.FindAncestor<DataGridRow>(sender);
if (ancestor != null)
{
MessengerInstance.Send(new FindDetailsMessage(this, SelectedItem.Name, false));
}
}
);
}
return mouseDoubleClickCommand;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在我的视图模型中删除与视图相关的代码(具有依赖项对象和可视树帮助器的代码),因为这会以某种方式破坏可测试性.但另一方面,这种方式我避免当用户没有点击一行而是在标题上发生某些事情时.
PS:我试着看一下附加的行为,但是我无法在工作中从Skydrive下载,所以"内置"解决方案最好.
我似乎无法弄清楚这一点.我在这里找到了一些类似的问题,但要么我无法找到正确的方向,要么我正在做一些完全错误的事情.
我的应用程序有一个Singleton类记录器,它保存程序中每个类的日志消息.
public class Logger
{
private Logger()
{
}
private static volatile Logger instance;
public static Logger GetInstance()
{
// DoubleLock
if (instance == null)
{
lock (m_lock)
{
if (instance == null)
{
instance = new Logger();
}
}
}
return instance;
}
//Helper for Thread Safety
private static object m_lock = new object();
private ObservableCollection<string> _Log;
public ObservableCollection<string> Log
{
get { return _Log; }
}
public void Add(string text)
{
if (_Log == null)
_Log = …Run Code Online (Sandbox Code Playgroud) 我在包含颜色和画笔的WPF类库中定义了一个Reource Dictionary,名为BrushResources.xaml.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Lots of Colors and Brushes here>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
我想在另一个程序集的代码中使用一些Brushes,它引用了这个库项目.如何获得它的实例ResourceDictionary?
我正在构建一个包含某些解析器的库.这些解析器内部使用ANTLR4构建.由于生成的类都是公共的,因此我的库的用户能够看到他们不需要查看的所有类.Sandcastle文档还包含所有这些类.有什么方法可以让Antlr让生成的类内部而不是公开?
我正在尝试将一些 json 反序列化为一些继承自 Reactive UI 的 ReactiveObject 类的简单对象。由于某种原因,那里的房产永远不会被填满。使用 POCO 可以正常工作,不会出现任何问题。
class Program
{
class Profile
{
public string Name { get; set; }
}
class ReactiveProfile : ReactiveObject
{
private string _name;
public string Name
{
get => _name;
set => this.RaiseAndSetIfChanged(ref _name, value);
}
}
static void Main(string[] args)
{
var profiles = new List<Profile>()
{
new Profile() {Name = "Foo"},
new Profile() {Name = "Bar"}
};
var path = @"C:\temp\profiles.json";
File.WriteAllText(path,
JsonConvert.SerializeObject(profiles.ToArray(),
Formatting.Indented,
new StringEnumConverter()),
Encoding.UTF8);
// works …Run Code Online (Sandbox Code Playgroud) 我有这个方法:
public void Foo(double[] values1, double[] values2, int[] indexes)
{
var values1AtIndexes = new List<double>();
var values1NotAtIndexes = new List<double>();
var values2AtIndexes = new List<double>();
var values2NotAtIndexes = new List<double>();
for (int i = 0; i < values1.Length; i++)
{
if (indexes.Contains(i))
{
values1AtIndexes.Add(values1[i]);
values2AtIndexes.Add(values2[i]);
}
else
{
values1NotAtIndexes.Add(values1[i]);
values2NotAtIndexes.Add(values2[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有LINQ方式吗?
基本上我在这里使用了发布的转换器,只是将数据类型更改为通用.如何在XAML中使用通用转换器?
public class ReverseListConverter<T> : MarkupExtension, IValueConverter
{
public ReverseListConverter()
{
}
private ObservableCollection<T> _reversedList;
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
_reversedList = new ObservableCollection<T>();
var data = (ObservableCollection<T>)value;
for (var i = data.Count - 1; i >= 0; i--)
_reversedList.Add(data[i]);
data.CollectionChanged += DataCollectionChanged;
return _reversedList;
}
void DataCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var data = (ObservableCollection<T>)sender;
_reversedList.Clear();
for (var i = data.Count - …Run Code Online (Sandbox Code Playgroud) 我试图在具有多个命令绑定的DataGrid上创建ContextMenu.一些必须绑定到本地ViewModel(即行的ViewModel),一些绑定到父级ViewModel.
到目前为止,我没有运气跟随其他解决方案.我只能执行SubCommand.
MainViewModel
public class MainViewModel : ViewModelBase
{
public ObservableCollection<SubViewModel> Items { get; private set; }
public MainViewModel()
{
Items = new ObservableCollection<SubViewModel>();
Items.Add(new SubViewModel());
Items.Add(new SubViewModel());
}
private RelayCommand _mainCommand;
public ICommand MainCommand
{
get
{
if (_mainCommand == null)
{
_mainCommand = new RelayCommand(
() =>
{
Debug.WriteLine("MAINCOMMAND EXECUTED");
}
);
}
return _mainCommand;
}
}
}
Run Code Online (Sandbox Code Playgroud)
SubViewModel
public class SubViewModel : ViewModelBase
{
private RelayCommand _subCommand;
public ICommand SubCommand
{
get
{
if (_subCommand == null) …Run Code Online (Sandbox Code Playgroud)