除非在xaml.cs

时间:2019-07-16 13:30:02

标签: c# wpf binding

我一直在尝试将一个“正在下载...”弹出窗口设置为一个矩形,并在相关viewModel中以编程方式设置其可见性。如果我在xaml.cs文件中设置了布尔值,则它可以正常工作,但显然需要在viewmodel中进行设置,并且这样做就不会改变其可见性。

我已经检查过以前的解决方案,涉及引发propertyChanged事件和双向设置绑定。

<Rectangle 
    Width="400" 
    Height="200"
    x:Name="popup" 
    Fill="Red" 
    Visibility="{Binding PopupIsVisible, Converter={StaticResource ResBoolToVisibilityConverter}, UpdateSourceTrigger=PropertyChanged,         Mode=TwoWay}" />


private bool popupIsVisible;
public bool PopupIsVisible
{
    get { return popupIsVisible; }
    set
    {
         Set(ref popupIsVisible, value);
         RaisePropertyChanged("PopupIsVisible");
    }
}

编辑:根据要求,这是转换器

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        bool val;
        try
        {
            val = (bool)value;
        }
        catch (Exception)
        {
            return Visibility.Visible;
        }

        if(val)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Hidden;
        }

    }

EDIT2:应该通过按下按钮或在视图上等待10秒钟来查看弹出窗口,奇怪的是,仅在使用以下代码启动的第二种情况下才显示弹出窗口:

        worker = Task.Factory.StartNew(() =>
        {
            while (cycle)
            {
                // Check for cancellation 
                cancellationToken.ThrowIfCancellationRequested();

                LoadProcessList();

                Task.Delay(TIME_TO_REFRESH).Wait();
            }

        }, cancellationToken);

有什么想法吗?

最终编辑 我设法通过封装包含对布尔值所做的更改的函数来解决该问题,如下所示:

        Task.Run(() =>
        {
            LoadProcessList();
        });

感谢@lionthefox为我指出正确的方向!

1 个答案:

答案 0 :(得分:1)

您的绑定或布尔值可见性转换器似乎出了点问题。这是一个运行良好的示例。

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private bool popupIsVisible;
    public bool PopupIsVisible
    {
        get
        {
            return popupIsVisible;
        }
        set
        {
            popupIsVisible = value;
            OnPropertyChanged("PopupIsVisible");
        }
    }


    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

以下是XAML代码,

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="ResBoolToVisibilityConverter" />
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="60"/>
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="60"/>
    </Grid.RowDefinitions>
    <Rectangle Width="400" Height="200"x:Name="popup" Fill="Red" Visibility="{BindingPopupIsVisible, Converter={StaticResource ResBoolToVisibilityConverter}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
    <Button Grid.Column="1" Content="Toggle" Click="Button_Click"/>
</Grid>

它在这里工作。