Tôi có Markup này:WPF MultiBinding Fails. Tại sao?
<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>
Trong đoạn mã đằng sau tôi có dòng này trong phương pháp Window_Loaded:
DataContext = uiManager;
uiManager là loại UIManager có hai thuộc tính công cộng được đặt tên IsConnected và IsLoggedIn.
Mã này không thành công khi khởi động vì mảng giá trị trong Trình chuyển đổi được gọi bằng cách Ghép nối không được lấp đầy với các toán tử nhưng có giá trị là DependencyProperty.UnsetValue.
Khi tôi sử dụng đánh dấu bên dưới (và thay đổi loại đồng hồ của bộ chuyển đổi) nó hoạt động.
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</GroupBox.BorderBrush>
Dường như tập hợp ràng buộc thông qua DataContext trong mã phía sau không thành công trong ví dụ đầu tiên, nhưng hoạt động trong ví dụ thứ hai. Tại sao?
Đối với đầy đủ bên dưới lớp 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: Phương pháp chuyển đổi cho XAML không (nó không thành công về việc chuyển đổi để bool các giá trị [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;
}
cho XAML đang hoạt động:
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;
}
Bạn có thể đính kèm mã cho trình chuyển đổi của mình không? Có gì sai khi đặt GroupBox thành Brush thay vì thuộc tính SolidColorBrush.Color? – bendewey
Tôi đã thêm phương thức chuyển đổi. Tôi cần để lộ các tài sản màu sắc để có thể thực hiện một ColorAninmation. Điều này trong chính nó làm việc với XAML đầu tiên khi tôi loại bỏ MultiBinding. – Dabblernl