2016-12-15 55 views
1

我试图根据用户选择的listviewitem更新我的主窗口上的控件,但是当listviewitem选择被更改时,控件不会更新。WPF - 基于listviewitem选择更改控件。控件不更新

我用这篇文章作为参考How to dynamically change a WPF control's template using a checkbox?

编辑:我最初使用的ContentTemplate,但改变了这DataTemplate的基础上建议,但它仍然没有更新

的XMAL我的主窗口

<Window.Resources> 
    <DataTemplate x:Key="Default"> 
     <Grid Margin="20,280,0,0" /> 
    </DataTemplate> 
    <DataTemplate x:Key="ERAFileSelect"> 
     <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="218" Margin="20,280,0,0" VerticalAlignment="Top" Width="257" CornerRadius="15"> 
      <Grid Name="grdFileSelect"> 
       <Label x:Name="lblProcessContent" Content="Drag File or Manually Select File" HorizontalAlignment="Center" VerticalAlignment="Top" Width="257" HorizontalContentAlignment="Center"/> 
       <TextBox x:Name="txtEraFileName" HorizontalAlignment="Left" Height="23" Margin="10,80,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="235"/> 
       <Button x:Name="btnSelectFiles" Content="Manually Select File(s)" HorizontalAlignment="Left" Margin="10,161,0,0" VerticalAlignment="Top" Width="235" Height="45"/> 
      </Grid> 
     </Border> 
    </DataTemplate> 
    <DataTemplate x:Key="FCSFileSelect"> 
     <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="218" Margin="20,280,0,0" VerticalAlignment="Top" Width="257" CornerRadius="15"> 
      <Grid Name="grdFileSelect"> 
       <Label x:Name="lblProcessContent" Content="Drag File or Manually Select Files" HorizontalAlignment="Center" VerticalAlignment="Top" Width="257" HorizontalContentAlignment="Center"/> 
       <TextBox x:Name="txtFCSFileName_TQ02" HorizontalAlignment="Left" Height="23" Margin="10,40,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="174"/> 
       <Button x:Name="btnSelectFiles_TQ02" Content="Select" HorizontalAlignment="Left" Margin="189,37,0,0" VerticalAlignment="Top" Width="56" Height="28"/> 
       <TextBox x:Name="txtFCSFileName_TQ11" HorizontalAlignment="Left" Height="23" Margin="10,105,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="174"/> 
       <Button x:Name="btnSelectFiles_TQ11" Content="Selec" HorizontalAlignment="Left" Margin="189,100,0,0" VerticalAlignment="Top" Width="56" Height="28"/> 
       <TextBox x:Name="txtFCSFileName_TQ16" HorizontalAlignment="Left" Height="23" Margin="10,170,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="174"/> 
       <Button x:Name="btnSelectFiles_TQ16" Content="Select" HorizontalAlignment="Left" Margin="189,165,0,0" VerticalAlignment="Top" Width="56" Height="28"/> 
      </Grid> 
     </Border> 
    </DataTemplate> 
</Window.Resources> 
<Grid Margin="0,0,2,0"> 
    <GroupBox x:Name="gbxProgress" Header="Progress" HorizontalAlignment="Left" Margin="298,105,0,0" VerticalAlignment="Top" Height="445" Width="462" Foreground="Black"> 
     <ListBox x:Name="lbxProgress" HorizontalAlignment="Left" Height="408" Margin="10,10,0,0" VerticalAlignment="Top" Width="431" Foreground="Black" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Progress.Message}" /> 
    </GroupBox> 
    <Button x:Name="btnStart" Content="Start" HorizontalAlignment="Left" Margin="20,513,0,0" VerticalAlignment="Top" Width="100" Height="37" IsEnabled="{Binding Properties.StartButtonEnabled}" Click="btnStart_Click"/> 
    <Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="177,513,0,0" VerticalAlignment="Top" Width="100" Height="37"/> 
    <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="70" Margin="20,21,0,0" VerticalAlignment="Top" Width="740" CornerRadius="15"> 
     <Grid> 
      <Image HorizontalAlignment ="Left" Margin="10" Height="50" Width="50" VerticalAlignment="Center" Source="/Lib/Icons/User.png" /> 
      <TextBlock Name="txtUser" FontSize="20" Height="30" Width="200" Foreground="Red" HorizontalAlignment="Left" Margin="78,19,0,19"/> 
      <Image HorizontalAlignment ="Left" Margin="443,8,0,10" Height="50" Width="50" VerticalAlignment="Center" Source="Lib/Icons/Watch.png" /> 
      <TextBlock x:Name="txtRunTime" FontSize="20" Height="30" Width="200" Foreground="Red" HorizontalAlignment="Left" Margin="519,19,0,19" Text="{Binding AppRunTime.TimeElapsed}" /> 
     </Grid> 
    </Border> 
    <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="144" Margin="20,119,0,0" VerticalAlignment="Top" Width="257" CornerRadius="15"> 
     <Grid> 
      <Label x:Name="lblProcessSelection" Content="Process Selection" HorizontalAlignment="Center" VerticalAlignment="Top" Width="257" HorizontalContentAlignment="Center"/> 
      <ListView x:Name="lvProcessSelection" HorizontalAlignment="Left" Height="93" Margin="10,30,0,0" VerticalAlignment="Top" Width="235" BorderThickness="0" SelectionChanged="lvProcessSelection_SelectionChanged"> 
       <ListViewItem Name="itmERA" Content="Expense Reserve Automation"/> 
       <ListViewItem Name="itmFCS" Content="Financial Close Status"/> 
       <ListViewItem Name="itmPEL" Content="Peel"/> 
      </ListView> 
     </Grid> 
    </Border> 
    <ContentControl DataContext="{Binding Properties}" Content="{Binding}"> 
    <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="ContentTemplate" Value="{StaticResource ERAFileSelect}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedProcess}" Value="Expense Reserve Automation"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ERAFileSelect}" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding SelectedProcess}" Value="Financial Close Status"> 
         <Setter Property="ContentTemplate" Value="{StaticResource FCSFileSelect}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</Grid> 

视图模型代码是

public class MainWindowModel 
{ 
    public ApplicationRunTime AppRunTime { get; set; } 
    public LogMessage Progress { get; set; } 

    public MainWindowProperties Properties { get; set; } 

    public MainWindowModel() 
    { 
     AppRunTime = new ApplicationRunTime(); 
     Progress = new LogMessage(); 
     Properties = new MainWindowProperties(); 
     Properties.StartButtonEnabled = false; 
    } 
} 

随着MainWindowProperties类

public class MainWindowProperties 
{ 
    public bool StartButtonEnabled { get; set; } 

    public string SelectedProcess { get; set; } 
} 

我的主窗口构造函数中我已经设置了DataContext的

 mainWindowModel = new MainWindowModel(); 
     this.DataContext = mainWindowModel; 

当从lvProcessSelection选择改变时,下面的代码被执行

 if (lvProcessSelection.SelectedItems.Count > 0) 
     { 
      mainWindowModel.Properties.SelectedProcess = ((ListViewItem)lvProcessSelection.SelectedItem).Content.ToString(); 
     } 
     else 
     { 
      mainWindowModel.Properties.SelectedProcess = string.Empty; 
     } 

这将使用“费用预留自动化”或“财务结算状态”在我的ViewModel中更新SelectedProcess

我知道DataContext的正确设置为我的视图模型(但可能不是在ContentControl中),因为我能够与新的消息来更新lbxProgress并与应用程序运行时更新txtRunTime

然而,当我改变选择在lvProcessSelection上没有任何反应; ERAFileSelect的默认控件仍然存在。

有人能指出我如何解决这个问题的正确方向吗?

回答

1

有人可以指出我在正确的方向如何解决这个问题吗?

你MainWindowProperties类应实现INotifyPropertyChanged接口并且每当SelectedProcess属性设置为一个新值提高变更通知:

public class MainWindowProperties : INotifyPropertyChanged 
{ 
    public bool StartButtonEnabled { get; set; } 

    private string _selectedProcess; 

    public string SelectedProcess 
    { 
     get { return _selectedProcess; } 
     set { _selectedProcess = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

请参阅MSDN关于这个共同的接口的详细信息:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

您绑定的每个视图模型/模型都必须实现此接口,并为要更新的视图中的任何目标值引发更改通知。

+0

干杯。任何想法为什么我的btnStart的Enabled属性绑定到Properties.StartButtonEnabled时它的工作原理是从true更改为false?真的好奇。 – gheff

+0

我看不到你在代码中设置了StartButtonEnabled属性的位置,所以我无法回答。但是,如果您打算在运行时动态设置它,则应该像SelectedProcess属性一样实现StartButtonEnabled属性,并在其setter中引发PropertyChanged事件。 – mm8

1

为什么你没有使用数据模板?数据模板将在这种情况下工作。

+0

将ControlTemplate更新为DataTemplate,然后在ContentControl中设置Property =“ContentTemplate”而不是Property =“Template”不会产生任何影响。控件仍然不更新 – gheff

+0

您需要设置内容控件的内容属性。内容=“{绑定}” – Rudra

+0

这没有任何区别。 ContentControl的其他绑定权限?对不起,我是WPF的新手。我已更新上述XAML以反映您的建议 – gheff