@ Предложение Алена выглядит интересно.
Кроме того, поскольку ваши свойства оценивать дорого, вы должны также рассмотреть асинхронные и приоритетные привязки.
Асинхронный пример:
<TextBox Text={Binding Path=Description, IsAsync="True"}/>
Установка IsAsync = True не позволит оценке привязки блокировать поток пользовательского интерфейса.
Вы также можете использовать приоритетное связывание, которое является формой множественного связывания:
<Grid>
<Grid.DataContext>
<Samples:PriorityBindingViewModel/>
</Grid.DataContext>
<TextBox>
<TextBox.Text>
<PriorityBinding>
<Binding Path="ExpensiveProperty" Mode="OneWay" IsAsync="True"/>
<Binding Path="LessExpensiveProperty" Mode="OneWay" IsAsync="True"/>
<Binding Path="LeastExpensiveProperty" Mode="OneWay" IsAsync="True"/>
</PriorityBinding>
</TextBox.Text>
</TextBox>
</Grid>
Привязки оцениваются с приоритетом сверху вниз. Это позволяет поместить, например, сообщение «загрузка ...» в привязку с самым низким приоритетом (LeastExорогоProperty) во время оценки высокоприоритетных, но более медленных привязок.
public class PriorityBindingViewModel
{
private string _expensiveProperty;
private string _lessExpensiveProperty;
public PriorityBindingViewModel()
{
ExpensiveProperty = "Loaded";
LessExpensiveProperty = "Still loading";
LeastExpensiveProperty = "Loading";
}
public string ExpensiveProperty
{
get
{
// Thread.Sleep is in place of an 'expensive' operation.
// Just in case anyone doesn't realize.
Thread.Sleep(8000);
return _expensiveProperty;
}
private set { _expensiveProperty = value; }
}
public string LessExpensiveProperty
{
get
{
// Same here.
Thread.Sleep(3000);
return _lessExpensiveProperty;
}
private set { _lessExpensiveProperty = value; }
}
public string LeastExpensiveProperty { get; private set; }
}