在WPF中的视图中进行更改时,ViewModel中的文本框值不会更新

时间:2013-07-17 06:40:10

标签: wpf mvvm wix bootstrapper burn

当我更改文本框值时,它不会在视图模型中更新。

这是我在视图中的文本框xaml

<TextBox Height="23" HorizontalAlignment="Left" Margin="153,65,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=InstallPath, Mode=TwoWay}"/>

视图的完整xaml,

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

<Grid>

    <Button Content="Configure Logger" Height="44" HorizontalAlignment="Left" Margin="402,125,0,0" Name="button1" VerticalAlignment="Top" Width="108" Click="button1_Click" />
    <Button Content="Load DB" Height="43" HorizontalAlignment="Left" Margin="402,200,0,0" Name="button3" VerticalAlignment="Top" Width="108" Click="button3_Click" />
    <TextBlock Height="23" HorizontalAlignment="Left" Margin="46,36,0,0" Name="textBlock1" Text="SQL Server" VerticalAlignment="Top" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="153,36,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" TextChanged="textBox1_TextChanged" />
    <GroupBox Header="DB Names" HorizontalAlignment="Left" Margin="54,114,0,0" Name="groupBox1" VerticalAlignment="Top" >

    </GroupBox>


    <TextBlock Text="Test bootstrapper application." Margin="10" FontSize="18" HorizontalAlignment="Center" Foreground="Red" VerticalAlignment="Top" />
    <TextBlock Height="23" HorizontalAlignment="Left" Margin="46,65,0,0" Name="textBlock2" Text="Installation Path" VerticalAlignment="Top" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="153,65,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=InstallPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

    <Ellipse Height="100" Width="100" HorizontalAlignment="Center" VerticalAlignment="Center" StrokeThickness="6" Margin="278,129,216,112"
             Visibility="{Binding Path=IsThinking, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Ellipse.Stroke>
            <LinearGradientBrush>
                <GradientStop Color="Red" Offset="0.0"/>
                <GradientStop Color="White" Offset="0.9"/>
            </LinearGradientBrush>
        </Ellipse.Stroke>
        <Ellipse.RenderTransform>
            <RotateTransform x:Name="Rotator" CenterX="50" CenterY="50" Angle="0"/>
        </Ellipse.RenderTransform>
        <Ellipse.Triggers>
            <EventTrigger RoutedEvent="Ellipse.Loaded">
                <BeginStoryboard>
                    <Storyboard TargetName="Rotator" TargetProperty="Angle">
                        <DoubleAnimation By="360" Duration="0:0:2" RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Ellipse.Triggers>
    </Ellipse>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right">
        <Button Content="Install" Command="{Binding Path=InstallCommand}" Visibility="{Binding Path=InstallEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="10" Height="20" Width="80"/>
        <Button Content="Uninstall" Command="{Binding Path=UninstallCommand}" Visibility="{Binding Path=UninstallEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="10" Height="20" Width="80"/>
        <Button Content="Exit" Command="{Binding Path=ExitCommand}" Margin="10" Height="20" Width="80" />
    </StackPanel>
     </Grid>

视图模型

 private string installPath;
    public string InstallPath
    {
        get { return installPath; }
        set
        {
            installPath = value;
            RaisePropertyChanged("InstallPath");                
        }

使用WIX Bootstrapper

中的文本框值的方法
 protected override void Run()
 {            

    MainViewModel viewModel = new MainViewModel(this); 
    BootstrapperDispatcher = Dispatcher.CurrentDispatcher;         

    MainView view = new MainView();            
    view.DataContext = viewModel;
    this.Engine.Log(LogLevel.Verbose, "My text input is: " + view.textBox2.Text);
    viewModel.Bootstrapper.Engine.StringVariables["MyBurnVariable1"] = viewModel.InstallPath;

}

viewModel.InstallPath为空,即使我更改了文本框中的值,我是否会遗漏某些内容?

我只是按照以下链接中解释的以下WIX Bootstrapper示例, http://bryanpjohnston.com/2012/09/28/custom-wix-managed-bootstrapper-application/

2 个答案:

答案 0 :(得分:6)

使用您提供的代码,您的绑定和设置似乎没问题。

您应该注意UpdateSourceTrigger的默认TextBox LostFocus ,因此只有在TextBox失去焦点时才会更新您的属性。

您可以将UpdateSourceTrigger更改为 PropertyChanged ,这样每次在TextBox中写入Text时,您的属性都会更新。

您可以在绑定中设置UpdateSourceTrigger,如下所示

<TextBox Text="{Binding Path=InstallPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

答案 1 :(得分:1)

您需要使用 UpdateSourceTrigger = PropertyChange 才能将您的视图更改反映回ViewModel。

<TextBox Text="{Binding Path=InstallPath,Mode=TwoWay,UpdateSourceTrigger=PropertyChange}"/>