【发布时间】: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