【问题标题】:IValueConverter and VisibilityIValueConverter 和可见性
【发布时间】:2014-11-14 07:07:22
【问题描述】:

我有一个具有 3 种通信状态的应用程序:已连接、已断开连接和待处理。通信状态由其他一些参数控制。我想在由 IValueConverter 控制的屏幕上显示相应的图像。但我无法让它工作。

这是我用于包含 3 个图像的 Xaml 代码:

<Image x:Name="connectedImage"  
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterConnected}"
    Source="Assets/connected.png"
    Stretch="None"
    HorizontalAlignment="Center" />



<Image x:Name="disconnectedImage"
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterDisconnected}"
    Source="Assets/disconnect.png"
    Stretch="None"
    HorizontalAlignment="Center" />


<Image x:Name="pendingImage"
    Visibility="{Binding ConnectionWithServerEstablished, Converter={StaticResource communitationStateToVisibilityConverter}, ConverterParameter=ConverterParameterPending}"
    Source="Assets/pending.png"
    Stretch="None"
    HorizontalAlignment="Center" />

这里是控制 CommunitationState 的方法

public enum CommunitationState { Connected, Disconnected, Pending }

public CommunitationState ConnectionWithServerEstablished
{
    get
    {
        if (IRCommandSent)
            return CommunitationState.Disconnected;

        if (wifiConnected && !fcConnected)
            return CommunitationState.Pending;

        return wifiConnected ? CommunitationState.Connected : CommunitationState.Disconnected;
    }
}

最后但并非最不重要的转换器:

  public class CommunitationStateToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            var result = Visibility.Collapsed;

            if ((string)parameter == "ConverterParameterConnected")
                result = (CommunitationState)value == CommunitationState.Connected ? Visibility.Visible : Visibility.Collapsed;

            if ((string)parameter == "ConverterParameterDisconnected")
                result = (CommunitationState)value == CommunitationState.Disconnected ? Visibility.Visible : Visibility.Collapsed;

            if ((string)parameter == "ConverterParameterPending")
                result = (CommunitationState)value == CommunitationState.Pending ? Visibility.Visible : Visibility.Collapsed;
            Debug.WriteLine("value={0}, parameter={1}, result={2}", value,   (string)parameter, result);
            return result;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }

数据绑定按预期工作。我知道这是肯定的,因为我有一个文本框绑定了另一个将状态显示为文本的方法。我的转换器被调用,我肯定知道,因为我可以在其中放置一个断点。

所以我的转换器有问题,因为我总是以折叠的图像结束。

**** 编辑 ****

这是我的 debug.Writeline 的一些输出

我启动连接:

value=Connected, parameter=ConverterParameterConnected, result=Visible
value=Connected, parameter=ConverterParameterDisconnected, result=Collapsed
value=Connected, parameter=ConverterParameterPending, result=Collapsed

我改为待定:

value=Pending, parameter=ConverterParameterConnected, result=Collapsed
value=Pending, parameter=ConverterParameterDisconnected, result=Collapsed
value=Pending, parameter=ConverterParameterPending, result=Visible

我正在等待启动:

value=Connected, parameter=ConverterParameterConnected, result=Visible
value=Connected, parameter=ConverterParameterDisconnected, result=Collapsed
value=Connected, parameter=ConverterParameterPending, result=Collapsed
value=Pending, parameter=ConverterParameterConnected, result=Collapsed
value=Pending, parameter=ConverterParameterDisconnected, result=Collapsed
value=Pending, parameter=ConverterParameterPending, result=Visible

这是正确的,因为我的程序默认为已连接,一秒钟后它意识到它看不到 TCP 服务器但仍然可以访问 Wifi,因此我将状态更改为挂起。

【问题讨论】:

  • 如果您将 Visibility=Visible 放入 XAML 而不是绑定中,图像会显示吗?此外,请尝试使用调试器单步执行您的值转换器。
  • 我没有尝试过,但是我尝试对转换器进行硬编码以返回 Visibility.Visible,然后显示图像。
  • 调试器在 Convert() 中显示哪些参数值?
  • 程序启动并默认为已连接。然后状态变为挂起(这是正确的),这就是我在调试器中得到的: value=Connected parameter=ConverterParameterConnected value=Pending parameter=ConverterParameterDisconnected value=Pending parameter=ConverterParameterPending value=Pending parameter=ConverterParameterConnected
  • 代码可以正常工作,因为我已将其拉入使用 TextBlocks 而不是您的图像的测试应用程序中。正如 helb 所说,可能的原因是您没有在正确的位置调用 OnPropertyChanged("ConnectionWithServerEstablished"),即当任何受影响的属性发生更改或图像由于某种原因而没有出现 Visibility="Visible" 时。转换器不是问题

标签: c# .net xaml windows-rt


【解决方案1】:

从您的 cmets 来看,您的 ConnectionWithServerEstablished 属性很可能不会更改以使图像可见,并且/或者当属性值更改时您没有触发 PropertyChanged 事件。

例如,您可以通过在依赖属性的设置器中触发事件来执行此操作:

public bool IRCommandSent
{
    set
    {
        // set the value
        // ...

        // notify event listeneers that the ConnectionWithServerEstablished may have changed
        if (PropertyChanged != null)
        {
             PropertyChanged(this, new PropertyChangedEventArgs("ConnectionWithServerEstablished"));
        }
    }
}

您用作 DataContext 的类(您的 ViewModel)当然必须为此实现 INotifyPropertyChanged

【讨论】:

  • 正如你在我最近的评论中看到的那样,情况并非如此。
  • OnPropertyChanged 的​​代码:protected void OnPropertyChanged(string name) { var handler = this.PropertyChanged; if (handler != null && this.dispatcher != null) { dispatcher.BeginInvoke(() => { handler(this, new PropertyChangedEventArgs(name)); }); } }
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多