我有一个WPF应用程序,它在ViewModel中调用MessageBox.Show()方式(以检查用户是否真的要删除).这实际上是有效的,但是违背了MVVM,因为ViewModel不应该明确地确定View上发生了什么.
所以现在我在想如何在我的MVVM应用程序中最好地实现MessageBox.Show()功能,选项:
我可以收到一条短信,上面写着"你确定......?" 以及我的XAML中的边框中的两个按钮是和否全部,并在模板上创建一个触发器,使其基于名为AreYourSureDialogueBoxIsVisible的ViewModelProperty折叠/可见,然后当我需要此对话框时,将AreYourSureDialogueBoxIsVisible指定为"true" "还可以通过我的ViewModel中的DelegateCommand处理这两个按钮.
我也可以尝试用XAML中的触发器来处理这个问题,这样删除按钮实际上只会使一些Border元素出现,其中包含消息和按钮,而Yes按钮实际上是删除了.
对于曾经使用MessageBox.Show()的几行代码而言,这两种解决方案似乎都过于复杂.
您在哪些方面成功实现了MVVM应用程序中的Dialogue Box?
我经常在.NET和PHP开发之间切换.使用ASP.NET站点,我在web.config文件中保存配置信息(例如连接字符串,目录,应用程序设置),该文件受到适当保护并且易于访问值等.
在PHP中,我用一个为每个变量都有静态方法的类来解决这个问题:
class webconfig {
public static function defaultPageIdCode() {
return 'welcome';
}
}
Run Code Online (Sandbox Code Playgroud)
app变量包含的文件是通过一行访问的:
$dp = webconfig::defaultPageIdCode();
Run Code Online (Sandbox Code Playgroud)
而且由于PHP没有编译,因此很容易telnet并更改网站的值,所以这个解决方案工作得相当好,并给我这两个优点:
但我可以想象,人们可以通过其他方式解决在PHP中保存Web配置设置的问题,这可能具有其他优势.
特别是那些有许多PHP框架经验的人,还有哪些方法可以保存配置变量及其优缺点?
我正在从Eclipse迁移到Visual Studio .NET,除了两个以外,我找到了所有我心爱的热键:
有没有人在Visual Studio .NET中发现这些热键功能?
附录:
您将使用上述第二个功能的一个示例是将底线向上移动到for循环中.在Eclipse中,您可以将光标放在Console.WriteLine上然后按ALT-(uparrow),我会一直使用它:一个键行程来上下移动行.
for (int i = 0; i < 10; i++) {
}
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)
好的,用无选择ctrl-c推断Charlie的想法来选择一行,在Visual Studio中你可以将光标放在Console.WriteLine上,(无选择)按CTRL- X然后向上移动并按CTRL- V.
我有一个MainResources.xaml文件,其中我有一个样式,定义我的应用程序中的每个窗口的外观:
<Style x:Key="MainBorderStyle" TargetType="{x:Type Border}">
<Setter Property="Background" Value="WhiteSmoke" />
<Setter Property="BorderBrush" Value="LightGray" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="5" />
<Setter Property="SnapsToDevicePixels" Value="True" />
</Style>
Run Code Online (Sandbox Code Playgroud)
而不是"WhiteSmoke"我希望我的背景是这个渐变:
<LinearGradientBrush>
<GradientStop Color="#ccc" Offset="0"/>
<GradientStop Color="#bbb" Offset="1"/>
</LinearGradientBrush>
Run Code Online (Sandbox Code Playgroud)
但是下面的尝试导致VS2008告诉我"样式设置器不支持子元素":
<Style x:Key="MainBorderStyle" TargetType="{x:Type Border}">
<Setter Property="Background">
<LinearGradientBrush>
<GradientStop Color="#ccc" Offset="0"/>
<GradientStop Color="#bbb" Offset="1"/>
</LinearGradientBrush>
</Setter>
<Setter Property="BorderBrush" Value="LightGray" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="5" />
<Setter Property="SnapsToDevicePixels" Value="True" />
</Style>
Run Code Online (Sandbox Code Playgroud)
将渐变色作为此样式的背景的正确方法是什么?
我正在尝试从此站点安装SQL Server 2008 R2 Express:
http://www.microsoft.com/express/database/
我有一台64位的Windows 7机器.
我已经尝试了32位和64位版本,但每个版本都失败了"性能计数器注册表配置单元一致性".
我该如何解决这个问题,以便安装SQL Server 2008 R2 Express?

我有以下Excel文件:

我通过循环遍历每个单元格并获取值来读取它getCell(...)->getValue():
$highestColumnAsLetters = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); //e.g. 'AK'
$highestRowNumber = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestRow();
$highestColumnAsLetters++;
for ($row = 1; $row < $highestRowNumber + 1; $row++) {
$dataset = array();
for ($columnAsLetters = 'A'; $columnAsLetters != $highestColumnAsLetters; $columnAsLetters++) {
$dataset[] = $this->objPHPExcel->setActiveSheetIndex(0)->getCell($columnAsLetters.$row)->getValue();
if ($row == 1)
{
$this->column_names[] = $columnAsLetters;
}
}
$this->datasets[] = $dataset;
}
Run Code Online (Sandbox Code Playgroud)
但是,虽然它读取的数据很好,但它在字面上读入了计算:

我从像这样的讨论中理解我可以getCalculatedValue()用于计算细胞.
问题是在我导入的Excel工作表中,我事先不知道哪些单元格是计算的,哪些不是.
有没有办法让我以一种自动获取值的方式读取单元格的值,如果它有一个简单的值,并获得计算的结果,如果它是一个计算?
事实证明,这getCalculatedValue()适用于所有单元格,让我想知道为什么这不是默认值,getValue()因为我认为人们通常会想要计算的值而不是方程本身,无论如何这都有效:
...->getCell($columnAsLetters.$row)->getCalculatedValue();
Run Code Online (Sandbox Code Playgroud)

似乎我制作的ViewModels看起来像其他类一样可疑,它们似乎需要大量的代码重复,例如在我当前的项目中:
因此,我的ViewModel与我的模型基本相同,只是具有与View绑定的所有OnPropertyChanged功能.
似乎我重构并扩展了我对模型所做的每一点改变,我必须对 ViewModel 进行镜像更改.
这似乎违反了模式的基本规则不要重复自己.
我是否错误地实现了MVVM模式,或者它只是MVVM的固有特性,模型和ViewModel之间始终存在一对一的重复?
我的XAML中有许多元素,它们将前景="#555"定义为只读文本框中淡化文本的颜色.
<TextBlock Text="{Binding SingularModelClassFileTitle}" Margin="0 10 0 0"/>
<TextBox Text="{Binding SingularModelClassFileName}"
HorizontalAlignment="Left"
IsReadOnly="True"
Foreground="#555"
Width="500"/>
<TextBox
VerticalScrollBarVisibility="Visible"
AcceptsReturn="True"
Width="500"
Height="100"
IsReadOnly="True"
Foreground="#555"
Text="{Binding SingularModelClassContent}"
HorizontalAlignment="Left"
Margin="0 0 0 20"/>
Run Code Online (Sandbox Code Playgroud)
如何将此值放在XAML变量中并在每个属性中引用它,以便我只需要在一个位置更改它?
我想你可以做这样的事情:
<sys:String x:Key="ReadOnlyTextColor">#555</sys:String>
...
<TextBox Foreground="{StaticResource ReadOnlyTextColor}"/>
Run Code Online (Sandbox Code Playgroud)
那个属性xmlns:sys=...参考是什么?
我想让用户突出显示WPF DataGrid上的一行,然后按删除键删除该行.
问题是:即使您只是选择一行并离开它,也会触发选择更改,并且该行位于e.RemovedItems中(这很奇怪,为什么只是选择将它放在RemovedItems容器中?).
所以我正在寻找一个DeleteKeyPressed事件,所以我可以简单地处理它.那个事件叫什么?
我使用的是2009年3月的工具包.
XAML:
<Grid DockPanel.Dock="Bottom">
<toolkit:DataGrid x:Name="TheDataGrid"
SelectionChanged="TheDataGrid_SelectionChanged"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
Run Code Online (Sandbox Code Playgroud)
后台代码:
private void TheDataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (e.RemovedItems.Count > 0)
{
Message.Text = "The following were removed: ";
foreach (object obj in e.RemovedItems)
{
Customer customer = obj as Customer;
Message.Text += customer.ContactName + ",";
_db.Order_Details.DeleteAllOnSubmit(
customer.Orders.SelectMany(o => o.Order_Details));
_db.Orders.DeleteAllOnSubmit(customer.Orders);
_db.Customers.DeleteOnSubmit(customer);
}
}
try
{
_db.SubmitChanges();
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 你如何设置Height="*"和Height="Auto"代码背后?