WPF MVVM在您键入时更改TextBox大小

arm*_*ali 0 .net c# wpf xaml mvvm

我有一个TextBox,随着它的内容增长,我希望它增长,随着它的内容缩小,我希望它在高度和宽度方面都缩小.这可以通过挂钩到TextBox中的TextChanged事件来轻松实现,这意味着代码隐藏,这是我们在MVVM中应该避免的.所以问题是我们如何在MVVM中做到这一点?我们必须明显使用命令(实现ICommand接口的类),同时我们不能将命令挂钩到事件.

一种选择是使用System.Windows.Interactivity.我之前使用它并且它非常整洁,但是有些人可能实际上反对它,因为它使用了更多的Silverlight库.

还有其他选择吗?

一个更简单的XAML.请注意,我希望窗口更改它的大小,因为TextBox占据整个窗口:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid HorizontalAlignment="Stretch">
        <TextBox Width="Auto">            
        </TextBox>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

这是我的XAML:

<Window x:Class="SleekNoteUI.Views.SleekNoteView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <Window.Template>
        <ControlTemplate>
            <Border...>
                <Grid>
                    <Grid Grid.Row="1" x:Name="noteGrid">
                        <TextBox Grid.Row="0"
                                 Text="{Binding SomeText...}"
                                 Background="{Binding...}">
            </TextBox>
        </Grid>
        </Grid>
    </Border>
    </ControlTemplate>
</Window.Template>
</Window>
Run Code Online (Sandbox Code Playgroud)

Fed*_*gui 6

文本框收缩/增长为文本更改:

<TextBox HorizontalAlignment="Left" Width="Auto" MinWidth="10"/>
Run Code Online (Sandbox Code Playgroud)
  • 仅限XAML的解决方案.
  • 没有代码,
  • System.Windows.Interactivity.
  • 而不是将与尺寸相关的东西放在它们不属于的ViewModel中.

然后再次:

  • MVVM不是为了避免代码隐藏.它是关于将UI与业务/应用程序逻辑和数据分离.
  • System.Windows.Interactivity和WPF一样多,因为它是Silverlight,所以我不知道"有些人"正在谈论什么,但它的使用是完全有效的