每次有人要求我提供输入值的界面时,我发现自己创建了包含大量行和列的网格。试图寻找这个问题的答案,但发现很难
<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid.Resources>
<Style TargetType="RowDefinition">
<Setter Property="Height" Value="25"/>
</Style>
<Style TargetType="TextBox">
<Setter Property="Margin" Value="2"/>
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0">Input 1</TextBlock>
<TextBox Grid.Row="0" Grid.Column="1"></TextBox>
<TextBlock Grid.Row="1" Grid.Column="0">Input 2</TextBlock>
<TextBox Grid.Row="1" Grid.Column="1"></TextBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我想到的问题是是否有任何性能考虑,或者是否有另一种方法可以消除使用行号和列号维护属性的需要。
此处讨论了创建带有标签和输入的自定义控件的选项,但这会带来更多开销。
创建布局似乎有点重复,这让我想知道是否有一个工具可以做到这一点。
这是最好的方法吗?如果不是,为什么以及应该如何做?
我正在显示一个Forms窗口作为对话框
private void buttonOverview_Click(object sender, EventArgs e)
{
(new OverviewBox()).ShowDialog();
MessageBox.Show("Window Exited");
}
Run Code Online (Sandbox Code Playgroud)
OverviewBox 有一个刷新计时器,在构造函数中实例化
public OverviewBox()
{
InitializeComponent();
this._polltimer = new Timer { Interval = 30000, Enabled = true };
this._polltimer.Tick += (sender, e) => { this.Poll(); };
}
Run Code Online (Sandbox Code Playgroud)
该方法Poll异步从数据库获取数据并更新视图而不冻结它.
private void Poll()
{
Task.Run(() =>
{
if (!SessionContext.Connectable())
{
return;
}
try
{
[logics to get data]
this.dgvChangeCoordinators.BeginInvoke(new Action(() => { SetDataGridView(this.dataGridView, "<Data Description>", listwithdata); }));
}
catch (Exception ex)
{
Logger.Log(ex.ToString());
throw;
} …Run Code Online (Sandbox Code Playgroud) 对所有单独的组件进行了大量研究.但是,我不明白组件如何协同工作.几个安置问题在不同的场合困扰着我.我想了解为什么它的行为像它一样.
设计具有固定标题的网站,其中包含一些按钮.我希望按钮放在彩色行(NAV)上.这就是为什么我做了NAV的孩子.但是我似乎无法将按钮放在栏上.
HTML
<body>
<nav class="row">
<ul class="menu">
<li id="link1"><a href="#link1">Link 1</a></li>
<li id="link2"><a href="#link2">Link 2</a></li>
<li id="link3"><a href="#link3">Link 3</a></li>
<li id="link4"><a href="#link4">Link 4</a></li>
<li id="link5"><a href="#link5">Link 5</a></li>
</ul>
</nav>
<div class="row main">
@RenderBody()
</div>
Run Code Online (Sandbox Code Playgroud)
CSS
nav, div, li {
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
border: 1px dashed black;
}
.row {
width: 100%;
padding-left: 20px;
padding-right: 20px;
}
nav {
position: fixed;
top: 80px;
height: 40px;
z-index: 100;
background-color: Green;
border-bottom: solid greenyellow 2px;
}
.menu li { …Run Code Online (Sandbox Code Playgroud) 寻找将按钮命令绑定到ViewModel ICommand属性的最优雅解决方案,同时允许在View中进行确认.
我想做什么:
可以通过显示ViewModel中的消息框来满足确认要求.但是,我不认为这是要走的路.它不打破MVVM吗?如果CanExecute取决于UI(代码隐藏)和ViewModel的状态怎么办?此外,从ViewModel弹出消息框时的可测试性如何?
我尝试的另一件事是绑定OnClick(到View)和Command(到ViewModel).虽然事件始终在Command之前执行,但似乎无法取消执行该命令.此外,执行顺序似乎是一个未记录的功能,所以你不应该依赖它.除此之外,它仍然不允许CanExecute考虑View逻辑.
接下来我想出了以下解决方案:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Button Content="Do Work" Command="{Binding Path=ViewModel.SaveCommand}"/>
</Grid>
<SelectTemplateUserControl Visibility="Collapsed" OnTemplateSelected="SelectTemplate_OnTemplateSelected"/>
</Window>
Run Code Online (Sandbox Code Playgroud)
public partial class MainWindow : Window
{
private readonly MainViewModel _viewModel = new MainViewModel();
public MainWindow()
{
InitializeComponent();
}
public MainViewModel ViewModel { get { return this._viewModel; } }
public ICommand SaveCommand { get { return new RelayCommand<int>(this.Save, this.CanSave);} }
private bool CanSave(int templateId)
{
return this._viewModel.SaveCommand.CanExecute(null);
}
private void …Run Code Online (Sandbox Code Playgroud)