私はこのマークアップ持っている:私はwindow_loaded方法でこのラインを持っているの背後にあるコードではWPFマルチバインディングが失敗します。どうして?
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<SolidColorBrush x:Name="Border">
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</GroupBox.BorderBrush>
を:
DataContext = uiManager;
というUIManagerが接続されているとIsLoggedInという名前の2つのパブリックプロパティを持つタイプのUIManagerのです。
Multibindingによって呼び出されるConverterの値配列がブール値ではなく、値DependencyProperty.UnsetValueを持つため、このコードは起動時に失敗します。
私は以下のマークアップを使用して(そしてコンバータのreturntypeを変更すると)動作します。
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</GroupBox.BorderBrush>
コード内のDataContextを通じて結合セットの後ろに最初の例では失敗したが、2番目の1で動作しているようです。どうして? UIManagerのクラス下完全について
:
public class UIManager:IUIManager
{
#region Implementation of IUIManager
private const string IsLoggedInProperty = "IsLoggedIn";
private bool loggedIn;
private readonly object loggedInLock = new object();
public bool IsLoggedIn
{
get
{
lock (loggedInLock)
{
return loggedIn;
}
}
set
{
lock (loggedInLock)
{
if(value==loggedIn)return;
loggedIn = value;
OnPropertyChanged(IsLoggedInProperty);
}
}
}
private void OnPropertyChanged(string property)
{
if(PropertyChanged!=null)PropertyChanged(this,new PropertyChangedEventArgs(property));
}
private const string IsConnectedProperty = "IsConnected";
private bool isConnected;
private object isConnectedLock = new object();
public bool IsConnected
{
get
{
lock (isConnectedLock)
{
return isConnected;
}
}
set
{
lock (isConnectedLock)
{
if(value==isConnected)return;
isConnected = value;
OnPropertyChanged(IsConnectedProperty);
}
}
}
#endregion
#region Implementation of INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
EDIT:失敗XAML用 変換方法(それは値のブール値への変換に失敗した[0]用
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var is_connected = (bool) values[0];
var is_loggedin = (bool) values[1];
return is_loggedin
? is_connected
? Colors.YellowGreen
: Colors.Red
: Colors.Gray;
}
作業XAML:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var is_connected = (bool) values[0];
var is_loggedin = (bool) values[1];
return is_loggedin
? is_connected
? Brushes.YellowGreen
: Brushes.Red
: Brushes.Gray;
}
あなたのコンバーターのコードも添付できますか? SolidColorBrush.Colorプロパティの代わりにGroupBoxをブラシに設定すると何が問題になりますか? – bendewey
私はコンバータメソッドを追加しました。 ColorAninmationを実装するには、Colorプロパティを公開する必要があります。これは、マルチバインディングを削除すると、それ自体が最初のXAMLで動作します。 – Dabblernl